探究JVM和GC

来源:互联网 发布:在线课堂视频网校源码 编辑:程序博客网 时间:2024/06/02 13:40

 

1. Java堆中各代分布

1Java堆中各代分布

Young:主要是用来存放新生的对象。

Old:主要存放应用程序中生命周期长的内存对象。

Permanent:是指内存的永久保存区域,主要存放ClassMeta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放InstanceHeap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APPLOAD很多CLASS的话,就很可能出现PermGen space错误。

 

2. JVM 使用的GC算法是什么?

分代收集。

即将内存分为几个区域,将不同生命周期的对象放在不同区域里;

GC收集的时候,频繁收集生命周期短的区域(Young area)

比较少的收集生命周期比较长的区域(Old area)

基本不收集的永久区(Perm area)

 

3. GC Full GC 有什么区别?

GC(或Minor GC):收集 生命周期短的区域(Young area)

Full GC (或Major GC):收集生命周期短的区域(Young area)和生命周期比较长的区域(Old area)

他们的收集算法不同,所以使用的时间也不同。 GC 效率也会比较高,我们要尽量减少 Full GC 的次数。 当显示调用System.gc() 时,gc does a full collection(both young generation and tenured generation).

 

4. Minor GC后,Eden是空的吗?

是的,Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old generation 中。

 

5. Garbage collection options(JDK1.4)

2GC参数

堆设置
-Xms :
初始堆大小
-Xmx :
最大堆大小
-XX:NewSize=n :
设置年轻代大小
-XX:NewRatio=n:
设置年轻代和年老代的比值。如:3,表示年轻代与年老代比值为13,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n :
年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示EdenSurvivor=32,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n :
设置持久代大小
收集器设置
-XX:+UseSerialGC :
设置串行收集器
-XX:+UseParallelGC :
设置并行收集器
-XX:+UseParalledlOldGC :
设置并行年老代收集器
-XX:+UseConcMarkSweepGC :
设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n :
设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n :
设置并行收集最大暂停时间
-XX:GCTimeRatio=n :
设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode :
设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n :
设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

 

6. 例子:Heap size 设置

场景:在JAVA_HOMEdemo/jfc/SwingSet2/目录下执行下面的命令:

    java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar

系统输出:

Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space

Exception in thread "Image Fetcher 3" java.lang.OutOfMemoryError: Java heap space

Exception in thread "Image Fetcher 1" java.lang.OutOfMemoryError: Java heap space

Exception in thread “Image Fetcher 2” java.lang.OutOfMemoryError: Java heap space

调优:将-Xms-Xmx选项设置为32m,而-Xmn1/4-Xmx值。

结果:执行java -jar –Xmn8m –Xms32m -Xmx32m SwingSet2.jar,系统正常运行。

 

7. JVM  Runtime Data Area(运行时数据区):

3JVM运行时数据区()

Heap: JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的。

Method area: JVM只有一个为所有的线程所共享的方法区。它存储类结构,例如运行时常量池,成员和方法数据以及方法、构造方法的代码。

Java Stacks: 每个JVM线程拥有一个私有的栈。

Pc registers: JVM可以同时支持运行多个线程,因此每个线程需要各自的PC(program counter)寄存器。

Native method stacks: 保存native方法进入区域的地址 

 

4JVM运行时数据区()

HeapMethod area被所有线程共享,其生存期和JVM的生存期相同;Java StacksPc registersNative method stacks被每个线程独自拥有,其生存期和线程的生存期相同。

 

 

 

 

8. 常见的内存泄露错误

很多开发人员都碰到过java.lang.OutOfMemoryError的错误。这种错误又分两种:java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: PermGen space。引起这种错误的原因可能是程序问题,也可能是是JVM参数配置问题引起的。若是参数问题,前者可以同过配置-Xms-Xmx参数来设置,而后者可以通过配置 -XX:PermSize-XX:MaxPermSize来设置。

                            

9 参考资料:

 

1.  A brief history of garbage collection –

 

 

http://www-128.ibm.com/developerworks/java/library/j-jtp10283/

2.  Garbage collection in the HotSpot JVM –

http://www-128.ibm.com/developerworks/java/library/j-jtp11253/

3.  Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

4.  Diagnosing a GC problem –

http://java.sun.com/docs/hotspot/gc1.4.2/example.html

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新铺的瓷砖干滑怎么办 新买的拖鞋很滑怎么办 瓷砖地板刮花了怎么办 墙上瓷砖快掉了怎么办 香皂掉厕所堵了怎么办 陶瓷刀不锋利了怎么办 蒸馒头没有屉布怎么办 电炖锅水不沸腾怎么办 掉了一颗虎牙,怎么办 牙里面掉了一块怎么办 u盘坏了无法识别怎么办 u盘内容读不出来怎么办 u盘文件读不出来怎么办 u盘突然读不出来怎么办 u盘读取不出来怎么办 蛋糕卷底部粘纸怎么办 美瞳没有护理液怎么办 没有带护理液了怎么办 护理液忘记带了怎么办 康宁玻璃锅裂了怎么办 带隐形牙套喝酒怎么办 牙齿保持器丢了怎么办 牙套保持器坏了怎么办 牙齿磕掉了一小块怎么办 牙齿裂掉了一半怎么办 大牙缺了一小块怎么办 牙根碎了一小块怎么办 门牙碎了一小块怎么办 孩子门牙长歪了怎么办 儿童门牙长歪了怎么办 大门牙长歪了怎么办 下面牙齿长歪了怎么办 只有一颗牙齿歪怎么办 牙齿突然长歪了怎么办 有个牙齿长歪了怎么办 一颗大牙长歪了怎么办 一颗牙齿长偏了怎么办 一个门牙长歪了怎么办 儿童牙齿长歪了怎么办 孩子牙齿长歪了怎么办 宝宝门牙长歪了怎么办