最近研发部门把系统的稳定性放在了工作的首位,大家都在为此做努力。回想自己在做的项目,有些是没有性
能测试这个环节的,如何保证系统的稳定性呢?我想只能开发自己做性能测试了。性能测试涉及的知识面比较广,包括要了解内存区域划分、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
相关推荐
【狂神说JVM探究】是一份集合了多种格式的学习资料,主要涵盖了Java虚拟机(JVM)的基础知识。这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键...
【JVM探究】 Java虚拟机(JVM)是Java编程语言的核心组成部分,它负责执行Java程序,提供了一个跨平台的运行环境。理解JVM的工作原理对于优化Java应用程序性能至关重要。以下是一些关于JVM的关键知识点: 1. **JVM...
垃圾回收(Garbage Collection,GC)是JVM内存管理的一部分,它自动释放不再使用的对象占用的内存空间,以防止内存泄漏和内存溢出。常见的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法和分代收集算法等...
Monkey老师的JVM调优课程,无疑为我们提供了一个宝贵的平台,来深入探究JVM的工作原理及其优化技巧。下面,我们就一起来深入学习Monkey老师关于JVM调优的核心知识点。 首先,我们要明白JVM的重要性。它是Java程序...
使用JVisualVM、JConsole等工具监控JVM的运行状态,定期检查GC日志,分析对象的创建和销毁情况,从而找出性能瓶颈并针对性地进行优化。例如,JVisualVM提供了丰富的监控功能,可以帮助开发者深入了解JVM的内存使用...
在本篇文章中,我们将对比CLR和JVM的垃圾回收机制,从分代机制、回收模式、回收算法到查找存活对象的技术,深入探究它们之间的异同。 分代式垃圾回收是CLR和JVM的共同策略。该策略基于“弱代假设”,即大多数对象的...
《深入理解Java虚拟机:JVM高级特性与最佳实践》这本书是Java开发者深入探究JVM(Java Virtual Machine)的重要参考资料。JVM作为Java程序运行的基础,它的理解和优化对于提升Java应用性能至关重要。以下将详细阐述...
### 解决JVM实际使用的内存比-Xmx设置的值小的问题 #### 一、问题背景与初步探索 本文旨在探讨并解决一个常见的Java...通过合理选择GC算法、调整JVM参数等方式,可以有效解决这一问题,提高程序的性能和稳定性。
内容概要:本文详尽讲解了JVM的相关知识点,主要包括运行时内存结构、对象与内存溢出、GC算法及优化、class文件格式、类加载过程及其加载器工作机制。文中详细拆解了堆与栈的结构特性,阐述不同类型的内存溢出原因,...
同时,JVM还提供了多种GC类型,如Serial、Parallel、CMS和G1等。 5. **内存溢出与泄露**:了解如何识别和解决内存溢出(OOM)问题非常重要。常见的溢出类型包括堆溢出、栈溢出和方法区溢出。内存泄露通常由于对象...
导语想写一篇关于androidGC的想法来源于追查一个魅族手机图片滑动卡顿问题,由于不断的GC导致的丢帧卡顿的问题让我们想了很多方案去解决,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GCALLOC和...
包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC、类加载器、内存分配与回收策略等,全套视频加资料高清无密码 第1讲 说在前面的话 免费 00:05:07 第2讲 整个部分要讲的内容说明 免费 00:06:58 第3讲...
4. **源码分析**:通过阅读和理解JVM的GCT源码,深入探究其工作流程和决策机制。 5. **性能工具**:学习使用JVM提供的监控工具(如JConsole、VisualVM等),以及专门的性能分析工具(如JProfiler、YourKit),进行...
两种语言在垃圾回收(Garbage Collection,GC)机制上也表现出了截然不同的实现方式。 C语言的垃圾回收方式 C语言没有内建的垃圾回收机制,这是因为它主要是用指针来进行内存的分配与释放。在C语言中,程序员需要...
2. **对象创建与内存分配**:探究对象在JVM中的创建过程,了解新生代、老年代、持久代的内存分配策略。 3. **类加载机制**:分析类加载的双亲委派模型,理解类加载器的层次结构和自定义类加载器的实现。 4. **JVM...
通过以上内容的学习,我们可以看到Java开发进阶不仅仅是对语言本身的理解,更重要的是对其实现原理和技术细节的深入探究。无论是多线程还是JVM,都涉及到大量复杂的概念和技术点。掌握这些知识不仅能够帮助我们写出...
1. **JVM架构**:了解HotSpot JVM的工作原理,包括解释器、编译器(C1和C2)、垃圾收集器(如Parallel GC、G1 GC)等。 2. **Java编译过程**:从源码到字节码,再到机器码的转换过程,以及JIT编译的动态优化策略。 ...
面试是评估候选人在技术岗位上潜在能力的关键环节,尤其在知名公司如百度的校园招聘中,面试官会深入探究候选人的技术基础和解决问题的能力。以下将针对提供的部分面试题目进行详细解答: 1. **如何实现一个JVM** ...
JDK(Java Development Kit)是Java开发的核心工具集,包含了Java运行时环境(JRE)、编译器(javac)、JVM(Java虚拟机)和其他开发工具。源码学习则是对这些组件内部实现的探究。 1. **Java编译器(javac)** - ...