┌─────────────────────────────────────┐
│ 文章代碼(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