Java內存和垃圾回收無廢話手冊

原文地址: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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章