JVM性能測試與內存溢出
QQ群522720170
Java內存管理機制
? Java采用了自動管理內存的方式
? Java程序是運行在Jvm之中的
? Java的跨平臺的基於Jvm的跨平臺特性
? 內存的分配和對象的創建是在Jvm中
? 用戶可以通過一系列參數來配置Jvm
Jvm內存結構
棧內存
? 線程私有
? 生命周期和線程相同
? 主要存放內容
– 基本數據類型(int,char,float,double…)
– 對象的引用,指向了對象在堆內存中起始地址
– 通過-Xss參數配置
堆內存-heap
? 堆內存是Jvm中空間最大的區域
? 所有線程共享堆內存
? 所有的數組以及對象的實例都在此區域分配
? 堆內存大小通過參數進行配置
-Xmx:最大堆內存
-Xms:最小堆內存
堆內存構成
– 新生代:包括三塊區域,eden、from survivor(s0)、to survivor(s1)
– 老年代:old gen
比如,Object o = new Object()
其中,o存放在棧內存中,new Object()存放在堆內存中,變量o是Object對象的引用,o上存放了Object對象占用內存的起始地址
永久代-PermGen
? 永久代也叫方法區(Method Area)
? 各線程共享,主要存放類信息、常量、靜態變量,如public static int a = 10
? 垃圾回收行為比較少見
垃圾回收-GC
? 新生代引發的GC叫YoungGC
? 老年代引發的GC叫FullGC
FullGC會引起整個Jvm的用戶線程暫停,待垃圾回收完畢後,才繼續運行
永久代的回收
? 永久代回收“性價比”比較低
? 主要回收
– 廢棄的常量
– 無用的類
? 類的所有實例都已經被回收
? 加載該類的ClassLoader已經被回收
? 該類的Class對象沒有在任何地方被引用
內存溢出
? 堆內存溢出
– 堆內存中存在大量對象,這些對象都有被引用,當所有對象占用空間達到堆內存的最大值,就會出現內存溢出OutOfMemory:Java heap space
? 永久代溢出
– 類的一些信息,如類名、訪問修飾符、字段描述、方法描述等,所占空間大於永久代最大值,就會出現OutOfMemoryError:PermGen space
內存泄露檢測手段
– Jconsole
– Jvisualvm
– Jstat –gcutil pid 1000 100
– Jmap –histo pid | head -20
– Jmap –heap pid
JVM性能測試與內存溢出