1. 程式人生 > >JVM性能測試與內存溢出

JVM性能測試與內存溢出

就會 分享 最大 con 堆內存 溢出 bsp 地址 永久代

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性能測試與內存溢出