- 浏览: 1011383 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
JVM GC调整优化是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接 受的),而且由于跑在各个机器上的配置不同(主要cup个数,内存不同),所以使用的JVM GC种类也会不同。接下来,我简单介绍一下如何进行JVM GC调整优化。
首先说一下如何监视JVM GC,你可以使用我以前文章中提到的JDK中的jstat工具,也可以在java程序启动的opt里加上如下几个参数(注:这两个参数只针对SUN的HotSpotVM):
- -XX:-PrintGCPrintmessagesatgarbagecollection.Manageable.
- -XX:-PrintGCDetailsPrintmoredetailsatgarbagecollection.Manageable.(Introducedin1.4.0.)
- -XX:-PrintGCTimeStampsPrinttimestampsatgarbagecollection.Manageable(Introducedin1.4.0.)
当把-XX:-PrintGCDetails加入到javaopt里以后可以看见如下输出:
[GC[DefNew:34538K->2311K(36352K),0.0232439secs]45898K->15874K(520320K),0.0233874secs]
[FullGC[Tenured:13563K->15402K(483968K),0.2368177secs]21163K->15402K(520320K),[Perm:28671K->28635K(28672K)],0.2371537secs]
他们分别显示了JVM GC的过程,清理出了多少空间。第一行GC使用的是‘普通GC’(MinorCollections),第二行使用的是‘全GC’ (MajorCollections)。他们的区别很大,在第一行最后我们可以看见他的时间是0.0233874秒,而第二行的FullGC的时间是 0.2371537秒。第二行的时间是第一行的接近10倍,也就是我们这次调优的重点,减少FullGC的次数,以为FullGC会暂停程序比较长的时 间,如果FullGC的次数比较多。程序就会经常性的假死。当然这只是他们的表面现象,接下来我仔细介绍一下GC,和FullGC(为后面的调优做准 备)。
我们知道Java和C++的区别主要是,Java不需要像c++那样,由程序员主动的释放内存。而是由JVM里的 GC(GarbageCollection)来,在适当的时候替我们释放内存。JVM GC调整优化的内部工作,即JVM GC的算法有很多种,如:标记清除收集器,压缩收集器,分代收集器等等。现在比较常用的是分代收集(也是SUNVM使用的),即将内存分为几个区域,将不 同生命周期的对象放在不同区域里(新的对象会先生成在Youngarea,在几次GC以后,如过没有收集到,就会逐渐升级到Tenuredarea)。在 JVM GC收集的时候,频繁收集生命周期短的区域(Youngarea),因为这个区域内的对象生命周期比较短,GC效率也会比较高。而比较少的收集生命周期比 较长的区域(OldareaorTenuredarea),以及基本不收集的永久区(Permarea)。
注:Youngarea又分为三个区域分别叫Eden,和俩个Survivorspaces。Eden用来存放新的对象,Survivorspaces用于新对象升级到Tenuredarea时的拷贝。
我们管收集生命周期短的区域(Youngarea)的收集叫GC,而管收集生命周期比较长的区域(OldareaorTenuredarea)的收集叫FullGC,因为他们的收集算法不同,所以使用的时间也会不同。我们要尽量减少FullGC的次数。
接下来介绍一下HotSpotVMGC的种类,GC在HotSpotVM5.0里有四种。一种是默认的叫serialcollector,另外几种 分别叫 throughputcollector,concurrentlowpausecollector,incremental(sometimescalledtrain)lowpausecollector(废 弃掉了)。以下是SUN的官方说明:
1.Thethroughputcollector:thiscollectorusesaparallelversionoftheyounggenerationcollector.Itisusedifthe-XX:+UseParallelGCoptionispassedonthecommandline.Thetenuredgenerationcollectoristhesameastheserialcollector.
2.Theconcurrentlowpausecollector:thiscollectorisusedifthe-Xincgc™or-XX:+UseConcMarkSweepGCispassedonthecommandline.Theconcurrentcollectorisusedtocollectthetenuredgenerationanddoesmostofthecollectionconcurrentlywiththeexecutionoftheapplication.Theapplicationispausedforshortperiodsduringthecollection.Aparallelversionoftheyounggenerationcopyingcollectorisusedwiththeconcurrentcollector.Theconcurrentlowpausecollectorisusediftheoption-XX:+UseConcMarkSweepGCispassedonthecommandline.
3.Theincremental(sometimescalledtrain)lowpausecollector:thiscollectorisusedonlyif-XX:+UseTrainGCispassedonthecommandline.ThiscollectorhasnotchangedsincetheJ2SEPlatformversion1.4.2andiscurrentlynotunderactivedevelopment.Itwillnotbesupportedinfuturereleases.Pleaseseethe1.4.2GCTuningDocumentforinformationonthiscollector.
简单来说就是throughputcollector和concurrentlowpausecollector:使用多线程的方式,利用多CUP 来提高GC的效率,而throughputcollector与concurrentlowpausecollector的去别是 throughputcollector只在youngarea使用使用多线程,而concurrentlowpausecollector则在 tenuredgeneration也使用多线程。
根据官方文档,他们俩个需要在多CPU的情况下,才能发挥作用。在一个CPU的情况下,会不如默认的serialcollector,因为线程管理 需要耗费CPU资源。而在两个CPU的情况下,也挺高不大。只是在更多CPU的情况下,才会有所提高。当然 concurrentlowpausecollector有一种模式可以在CPU较少的机器上,提供尽可能少的停顿的模式,见下文。
当要使用throughputcollector时,在javaopt里加上-XX:+UseParallelGC,启动throughputcollector收集。也可加上-XX:ParallelGCThreads=来改变线程数。还有两个参数-XX:MaxGCPauseMillis=和-XX:GCTimeRatio=,MaxGCPauseMillis=用来控制最大暂停时间,而-XX:GCTimeRatio可以提高GC说占CPU的比,以最大话的减小heap。
当要使用concurrentlowpausecollector时,在java的opt里加上-XX:+UseConcMarkSweepGC。 concurrentlowpausecollector还有一种为CPU少的机器准备的模式,叫Incrementalmode。这种模式使用一个 CPU来在程序运行的过程中GC,只用很少的时间暂停程序,检查对象存活。
在Incrementalmode里,每个收集过程中,会暂停两次,第二次略长。第一次用来,简单从root查询存活对象。第二次用来,详细检查存活对象。整个过程如下:
- *stopallapplicationthreads;dotheinitialmark;resumeallapplicationthreads(第一次暂停,初始话标记)
- *dotheconcurrentmark(usesoneprocesorfortheconcurrentwork)(运行是标记)
- *dotheconcurrentpre-clean(usesoneprocessorfortheconcurrentwork)(准备清理)
- *stopallapplicationthreads;dotheremark;resumeallapplicationthreads(第二次暂停,标记,检查)
- *dotheconcurrentsweep(usesoneprocessorfortheconcurrentwork)(运行过程中清理)
- *dotheconcurrentreset(usesoneprocessorfortheconcurrentwork)(复原)
当要使用Incrementalmode时,需要使用以下几个变量:
- -XX:+CMSIncrementalModedefault:disabled启动i-CMS模式(mustwith-
- XX:+UseConcMarkSweepGC)
- -XX:+CMSIncrementalPacingdefault:disabled提供自动校正功能
- -XX:CMSIncrementalDutyCycle = default :50启动CMS的上线
- -XX:CMSIncrementalDutyCycleMin = default :10启动CMS的下线
- -XX:CMSIncrementalSafetyFactor = default :10用来计算循环次数
- -XX:CMSIncrementalOffset = default :0最小循环次数(Thisisthepercentage(0-
- 100)bywhichtheincrementalmodedutycycleisshiftedtotherightwithintheperiod
- betweenminorcollections.)
- -XX:CMSExpAvgFactor = default :25提供一个指导收集数
SUN推荐的使用参数是:
- -XX:+UseConcMarkSweepGC\
- -XX:+CMSIncrementalMode\
- -XX:+CMSIncrementalPacing\
- -XX:CMSIncrementalDutyCycleMin = 0 \
- -XX:CMSIncrementalDutyCycle = 10 \
- -XX:+PrintGCDetails\
- -XX:+PrintGCTimeStamps\
- -XX:-TraceClassUnloading
注:如果JVM GC中使用throughputcollector和concurrentlowpausecollector,这两种垃圾收集器,需要适当的挺高内存大小,以为多线程做准备。JVM GC调整优化到此结束。
发表评论
-
A Collection of JVM Options
2011-06-24 12:59 1158A Collection of JVM Options ... -
java中堆(heap)和堆栈(stack)有什么区别
2011-05-10 14:29 893stack 和 heep 都是内存的一部分 stack 空间 ... -
JVM & Memory (5) final
2011-05-10 14:25 995先说tuning,gc有两个指标,一个是frequentcy( ... -
JVM & Memory (4) gc
2011-05-10 14:22 911不同的JVM实现对堆结构的设计有所不同,这里先说说共性的,然后 ... -
JVM & Memory (3) thread
2011-05-10 14:21 906以下继续探讨,说说jvm ... -
JVM & Memory (2) java.exe
2011-05-10 14:20 944上篇说到了关于java heap ... -
JVM & Memory (1) paging
2011-05-10 14:19 959近期看了一些有关JVM和内存的资料,为了避免遗忘,特在这里作一 ... -
JDK TOOLS
2011-05-10 14:15 813以下这几种工具(存在于 ... -
jvm日志分析工具应用
2011-05-10 14:14 2816涛涛学习笔记之gc日志分析工具 测试环境:xp+weblog ... -
JVM优化配置
2011-05-10 13:56 934OOM 这个缩写就是Java程 ... -
高手详细介绍JVM是什么?
2011-05-10 13:52 874首先这里澄清两个概念:JVM实例和JVM执行引擎实例,JVM实 ... -
JVM监控工具介绍
2011-03-22 14:25 891... -
正确认识java JVM与c/c++的执行效率
2011-03-22 10:43 1412认为Java 不能写JVM是完全错误的。JNode是一个用 ... -
Java虚拟机(JVM)参数配置说明
2011-03-22 10:26 986Java虚拟机(JVM)参数配置说明 ... -
解析 Java 类和对象的初始化过程
2011-03-21 23:40 909解析 Java 类和对象的初始化过程 由一个单态模式引出的问 ... -
JDK的概念、组成及JDK常用包
2011-03-18 22:09 1139JDK概述 JDK (Java Development ... -
安装JDK后JRE与JVM联系浅谈
2011-03-18 22:08 916安装JDK后JRE、JVM之间的 ... -
详细介绍什么是Java虚拟机
2011-03-18 22:07 841本文由浅入深,先从什么是Java虚拟机、Java虚拟机 ... -
认识Java虚拟机及其性能
2011-03-18 22:04 726Java虚拟机(Java virtual ... -
Java虚拟机的研究与实现(图文)
2011-03-18 21:59 1033引言 Java 虚拟机本质是就是一个程序,当它在命令行 ...
相关推荐
jvmgc过程介绍(jpg)
本文档可以作为学习JVM GC的工具书所使用,对于想深入学习JVM GC原理的同学,这一本书就足够了。因为本文档是作者花费数月时间,查阅GC相关的国内外众多资料并加以思路清晰的条目化而形成。因为篇幅所限,可能有部分...
JVM GC垃圾回收.pdf
5. **GC调优**:包括如何分析GC日志,理解GC停顿(Stop-the-World)事件,以及如何通过调整JVM参数来改善系统性能,如设置堆大小、新生代与老年代的比例、存活代的晋升策略等。 6. **性能监控与诊断工具**:如...
5. **JVM调优**:通过调整JVM参数,可以控制GC的行为,例如设置堆大小、新生代和老年代的比例、GC策略等。常用的JVM参数有`-Xms`, `-Xmx`, `-Xmn`, `-XX:NewRatio`, `-XX:SurvivorRatio`, `-XX:+UseConcMarkSweepGC`...
在IT行业中,内存管理是Java开发中的一个关键环节,尤其是对于服务器端...总的来说,MAT是Java开发者解决内存问题的强大武器,结合JVM的GC机制,可以在Mac环境下对内存进行深入的分析和优化,提升应用的稳定性和性能。
Java 应用程序的JVM(Java虚拟机)性能优化是一个关键领域,而垃圾收集(GC)作为内存管理的一部分,其频率对系统性能有直接影响。GC的频率反映了系统的内存使用情况和健康状况。通常,GC分为两种主要类型:Scavenge...
JvmGC 收集器是 JVM 中的三个主要 GC 收集器之一,分别是 Serial GC、Parallel GC 和 Concurrent Mark-and-Sweep GC。 Serial GC Serial GC 是 JVM 默认的 GC 收集器,它使用单个线程来执行 GC 操作。这种 GC 适合...
Java虚拟机(JVM)的垃圾收集(Garbage Collection, GC)是Java应用程序性能的关键因素。GC日志分析工具是用来理解和优化JVM内存管理的重要...记住,优化JVM内存管理是一个持续的过程,需要不断地测试、分析和调整。
Java虚拟机(JVM)是Java程序运行的基础,它的配置参数和垃圾收集(GC)机制对于优化应用程序性能至关重要。本文将深入探讨JVM参数及其与Java垃圾收集相关的知识。 一、JVM参数详解 JVM参数可以分为三类:启动参数...
5. **内存池(Memory Pool)状态**:了解不同内存区域(如Eden、Survivor、Old等)的使用情况,有助于调整JVM参数以优化性能。 通过HPjmeter,开发者和运维人员能够深入理解JVM的行为,分析和优化应用程序性能,...
"用于测试jvm gc调优-share-jvm-gc.zip"这个压缩包文件很可能包含了一些工具、脚本或教程,用于帮助我们了解和实践JVM的垃圾收集优化。 首先,我们需要理解JVM GC的基本原理。垃圾收集器的主要任务是识别并回收不再...
开发者可以通过调整JVM参数,如设置年轻代与老年代的比例、分配的Region数量、暂停时间目标等,来优化G1 GC的行为,从而达到更好的系统性能。 总之,《深入理解JVM & G1 GC》这本书为读者提供了理解JVM内存模型和G1...
在实际调优过程中,我们通常会先使用默认配置运行应用,然后根据监控数据和日志信息找出问题,调整相关参数,再通过工具验证优化效果,如此反复迭代,直至找到最佳的JVM配置。这需要对JVM内部机制有深入理解,并具备...
综上所述,理解和应用JVM GC原理以及heapsize调优的方法对于Java应用程序的性能优化至关重要。了解垃圾回收机制、合理设置堆内存大小、选择合适的垃圾回收算法,以及诊断和解决GC性能问题,都是进行性能调优时需要...
优化GC策略通常包括调整JVM启动参数,如-server模式、堆内存大小、新生代与老年代的比例等。例如,通过-Xms和-Xmx参数可以设置堆的初始大小和最大大小。-Xmn参数可以用来设置新生代大小,而-XX:PermSize和-XX:...
java jvm GC和GC Tuning详解
《深入理解JVM & G1 GC》这篇文章和相关压缩包文件主要聚焦于Java虚拟机(JVM)的内存管理,特别是垃圾收集器(GC)的优化,特别是G1(Garbage-First)垃圾收集器的深度解析。下面将详细阐述JVM、GC的基本概念,...
- **GC的工作流程**:标记、清除、复制、压缩等过程。 - **垃圾收集器**:不同的JVM版本有多种GC实现,如Serial、Parallel、Concurrent Mark Sweep (CMS)、G1、ZGC、Shenandoah等,它们各有特点和适用场景。 4. *...
该文档不仅介绍了IBM JVM在内存管理方面的基本原理,还深入探讨了垃圾回收的过程及其优化策略。 #### 二、对象分配与可达性分析 - **对象分配**:在IBM JVM中,对象的分配主要是在堆内存(Heap)中进行的。对象...