最近研发部门把系统的稳定性放在了工作的首位,大家都在为此做努力。回想自己在做的项目,有些是没有性
能测试这个环节的,如何保证系统的稳定性呢?我想只能开发自己做性能测试了。性能测试涉及的知识面比较广,包括要了解内存区域划分、GC回收机制、JVM
的参数设置,性能监控分析工具的使用,监测数据的分析等。先把JVM和GC的基础知识总结一下,温故而知新。
1
.
Java
堆中各代分布
:
图1:Java堆中各代分布
Young:主要是用来存放新生的对象。
Old:主要存放应用程序中生命周期长的内存对象。
Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被
Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区域不同,GC(Garbage
Collection)不会在主程序运行期对PermGen
space进行清理,所以如果你的APP会LOAD很多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)
:
图2:GC参数
堆设置
-Xms :初始堆大小
-Xmx :最大堆大小
-XX:NewSize=n :设置年轻代大小
-XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个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_HOME下demo/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,而-Xmn为1/4的-Xmx值。
结果:执行java -jar –Xmn8m –Xms32m -Xmx32m SwingSet2.jar,系统正常运行。
7
.
JVM Runtime Data Area
(运行时数据区):
图3:JVM运行时数据区(一)
Heap: JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的。
Method area: JVM只有一个为所有的线程所共享的方法区。它存储类结构,例如运行时常量池,成员和方法数据以及方法、构造方法的代码。
Java Stacks: 每个JVM线程拥有一个私有的栈。
Pc registers: JVM可以同时支持运行多个线程,因此每个线程需要各自的PC(program counter)寄存器。
Native method stacks: 保存native方法进入区域的地址 。
图4:JVM运行时数据区(二)
Heap和Method area被所有线程共享,其生存期和JVM的生存期相同;Java Stacks、Pc registers、Native method stacks被每个线程独自拥有,其生存期和线程的生存期相同。
8.
常见的
内存泄露
错误
很多开发人员都碰到过java.lang.OutOfMemoryError的错误。这种错误又分两
种:java.lang.OutOfMemoryError: Java heap
space和java.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
相关推荐
此文档是本人在公司做技术分享,个人做的ppt。如果有同学需要做jvm和gc技术演讲得,可以参考此文档。
JVM与GC调优课程视频 〖课程介绍〗: JVM与GC调优课程视频 〖课程目录〗: 1.笔记/ ├── 第1篇-字节码篇.png?x-oss-process=style/pnp8 ├── 第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├── 第3篇-运行时...
JVM_GC调优
java进阶必备书籍,高清版。带目录结构。方便阅读,书中内容讲的透彻
因为篇幅所限,可能有部分知识点没有完全展开,但是对于GC领域的核心知识点几乎全部涵盖,很难在其他书籍和文档中涉及如此全面的内容。 本文档所涉及的知识点,以JVM GC为主要内容。同时,为了能更深入理解与之相关...
JVM_GC_-调优总结
jvmgc过程介绍(jpg)
JVM、GC详解及调优,JVM、GC详解及调优,JVM、GC详解及调优
JVM、GC详解及调优,资料很详细,清楚,仔细阅读
JVM 输出 GC 日志导致 JVM 卡住
NULL 博文链接:https://1358440610-qq-com.iteye.com/blog/2408052
GC有两种类型:Scavenge GC(也称Young GC)和Full GC。 一般Full GC时,机器的Load会升高,应用也会停止响应一会(持续长达几秒),如果应用一直频繁的进行FullGC,一方面会出现应用无法提供正常服务,另一方面...
用于测试jvm gc调优-share-jvm-gc
资源名称:深入理解JVM & G1 GC内容简介:G1 GC提出了不确定性Region,每个空闲Region不是为某个固定年代准备的,它是灵活的,需求驱动的,所以G1 GC代表了先进性。《深入理解JVM & G1 GC》主要为学习Java语言的...
JVM GC垃圾回收.pdf
深入jvm垃圾回收 调优细节。
jvm gc jvm gc jvm调优 查看工具
jvm配置参数详解,以及Java gc详解
本文档详细讲解了JVM(Java Visual Mathine)的方方面面,首先由java的特性来描绘JVM的大致应用,再详细阐释了 JVM 的原理及内存管理机制和调优,讲述了与JVM密切相关的 Java GC 机制,最后对 JVM 调优进行了总结。...
JVM体系结构与GC调优相关介绍,包含JVM体系结构、常用GC算法、内存管理、垃圾回收器、虚拟机调优、相关监控工具等