原文地址:http://www.spnguru.com/2010/08/java內存和垃圾回收無廢話手冊-2/
概念
Java的堆內存分爲三部分
- 新生代(New Generation) – 新創建的對象(又分爲S0,S1和Eden)
- 舊生代 (Old Generation) – 經過多次垃圾回收沒有被回收的對象或者大對象
-
持久代 (Permanent Generation) – JVM使用的內存,包含類信息等
Java的垃圾回收分爲兩種
-
Minor GC
回收新生代中的對象,代價低,速度快
-
Full GC
回收舊生代和持久代中的對象,代價高,速度慢
配置
通過指定Java命令行參數可以改變內存和垃圾回收的行爲。最常見的有
-Xmx1024m: 指定最大的堆大小爲1024m
-Xms1024m: 指定初始化堆大小爲1024m,設爲跟最大的堆大小,可避免JVM動態調整
-XX:NewRatio=3: 指定新生代和舊生代的比例爲1:3,比例越大,新生代越小,Minor GC調用越頻繁,Full GC調用越不頻繁。
-verbose:gc : 在控制檯打印GC信息
-XX:+PrintGCDetails:顯示更詳細的GC信息
-Xloggc:gc.log :輸出gc LOG到文件
工具
實時分析
圖形界面:JVisualVM+VisualGC插件
JVisualVM是Java自帶的工具,可以顯示heap的變化趨勢,更好的是通過visualgc這個插件來顯示各個代的具體變化趨勢。
命令行:jstat
jstat也是Java自帶的一個分析工具。可以使用命令jstat –gcutil 來顯示。
S0/S1/E/O/P-分別代表SO/S1/Eden/舊生代/永久代的大小
YGC/YGCT-代表minor gc的次數和時間
FGC/FGCT-代表full gc的次數和時間
GCT-代表GC的時間
tip:Pid可以通過jps命令來查到
Dump分析
Dump分析適用於那些需要詳細瞭解heap的分配情況,可以具體到哪個類
jmap+jhat/Eclipse Memory Analyzer
jmap用於dump heap信息到文件
jmap -dump:format=b,file=filename
jhat用於分析dump文件
jhat
默認啓動在7000端口,可以用瀏覽器打開localhost:7000
Eclipse Memory Analyzer是Eclipse的一個插件,相當強大,推薦使用,可以幫你做leak analysis,注意的是它默認排除掉unreachable objects
編程
有時候,我們希望在自己的程序中檢測當前memory的使用情況
堆檢測
1
2
3
4
5
6
7
|
MemoryMXBean
aMemoryMXBean=ManagementFactory.getMemoryMXBean(); MemoryUsage
heapMemoryUsage=aMemoryMXBean.getHeapMemoryUsage(); usedHeapMemory
= heapMemoryUsage.getUsed(); maxHeapMemory
= heapMemoryUsage.getMax(); |
內存檢測
1
2
3
4
5
|
freeMemory=
Runtime.getRuntime().freeMemory(); totalMemory=Runtime.getRuntime().totalMemory(); maxMemory=Runtime.getRuntime().maxMemory(); |