精華區beta GameDesign 關於我們 聯絡資訊
┌─────────────────────────────────────┐ │ 文章代碼(AID): #19BVzS2E (java) [ptt.cc] Re: [問題] 如何知道java程式吃了 │ │ 文章網址: http://www.ptt.cc/bbs/java/M.1227751260.A.08E.html │ │ 這一篇文章值 164 Ptt幣 │ └─────────────────────────────────────┘ 作者: svenlee (KOSS KSC35) 看板: java 標題: Re: [問題] 如何知道java程式吃了多少記憶體 時間: Thu Nov 27 10:00:58 2008 ※ 引述《spes (沒有)》之銘言: : ※ 引述《gech2001 (gech)》之銘言: : : 我現在跑一個可能會很大hash的程式 : : 現在想要分析使用的記憶體量對象能的影響 : : 可是google找不到似乎可行用來看程式用了多少memory的方法 : : 請問各位大大有哪一個方法知道吃了多少記憶體嗎 : : 謝謝大家~ : 如果是要在 Java 程式裡知道 java heap 被吃了多少, 那 : java.lang.Runtime.freeMemory(), : java.lang.Runtime.totalMemory() : 可以幫你的忙 : 如果是要在 windows 上知道某程式吃了多少 memory, 最簡單的就是按 : Ctrl + Alt + Del, 看一下 task manager 裡的 Mem Usage : 如果是想要做 profiling 的話, fillano 給的 link 可以幫你的忙 最近在實作底層的東西,所以用到一些memory status的工具,跟你分享。 以下code會使用到以下package: java.lang.management.* com.sun.management.OperatingSystemMXBean JVM主要有兩種記憶體種類,heap與non-heap memory, heap主要存放object 實例化 (instantiation)後所會佔用的區塊, 如果是Generational GC,所有object會區分為不同的Generation, 存放在不同的generation memory pool。 non-heap主要存放JVM本身所需使用的記憶體空間, 例如JIT Compiler的code cache(存放native code), 以及Class method area等等。 MemoryMXBean memory = ManagementFactory.getMemoryMXBean(); MemoryUsage heapUsage = memory.getHeapMemoryUsage(); logger.debug("Heap used: "+heapUsage.getUsed()); logger.debug("Heap comitted: "+heapUsage.getCommitted()); logger.debug("Heap max: "+heapUsage.getMax()); MemoryUsage nonheapUsage = memory.getNonHeapMemoryUsage(); logger.debug("NonHeap used: "+nonheapUsage.getUsed()); logger.debug("NonHeap comitted: "+nonheapUsage.getCommitted()); logger.debug("NonHeap max: "+nonheapUsage.getMax()); 以下可以印出每個Memory pool更詳細的內容。 List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans(); for(MemoryPoolMXBean pool : pools){ MemoryUsage usage = pool.getPeakUsage(); logger.debug("----------------"); logger.debug("name: "+pool.getName()); logger.debug("type: "+pool.getType().toString()); logger.debug("used: "+usage.getUsed()); logger.debug("commited: "+usage.getCommitted()); logger.debug("max: "+usage.getMax()); logger.debug("-----------------"); } 另外還有一種JNI使用的記憶體空間,不屬於以上類型。 就必須透過OS才能看到。 OperatingSystemMXBean osMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); logger.debug("Free physical memory: "+osMXBean.getFreePhysicalMemorySize()); logger.debug("Total physical memory: "+osMXBean.getTotalPhysicalMemorySize()); logger.debug("Free swap memory: "+osMXBean.getFreeSwapSpaceSize()); logger.debug("Total swap memory: "+osMXBean.getTotalSwapSpaceSize()); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 139.175.76.1 ※ 編輯: svenlee 來自: 139.175.76.1 (11/27 11:33)
yew:長知識了 感謝 11/27 12:34
MonyemLi:感謝您~收益非淺 12/23 00:21