- 浏览: 115406 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (98)
- java (27)
- jms (2)
- jta (0)
- 性能调优及内存分析 (4)
- 设计模式 (14)
- 框架 (6)
- 其它 (9)
- job (1)
- maven (1)
- 服务器 (2)
- 分布式 (3)
- ibatis (1)
- linux (0)
- mysql (0)
- 并发编程 (0)
- java多线程 (2)
- 前端跨域 (1)
- 线程dump分析 (0)
- velocity (0)
- 数据库 (2)
- 协议 (0)
- 监控 (0)
- 开源软件 (2)
- 算法 (0)
- 网络 (1)
- spring (1)
- 编码 (0)
- 数据结构 (0)
- HTable和HTablePool使用注意事项 (0)
- opencms (0)
- android (16)
- 操作系统 (2)
- top (0)
最新评论
-
hold_on:
@Override public boolea ...
android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片) -
achersnake:
123
Servlet中listener(监听器)和filter的总结 -
angel243fly:
我用了这个方法,还是报同样的错误,还有什么建议吗?
eclipse提示CreateProcess error=87错误的解决方法
来自:http://hi.baidu.com/i1see1you/blog/item/7ba0d250c30131481038c20c.html
一.概述 java的最大好处是自动垃圾回收,这样就无需我们手动的释放对象空间了,但是也产生了相应的负效果,gc是需要时间和资源的,不好的gc会严重影响系统的系能,因此良好的gc是JVM的高性能的保证。JVM堆分为新生代,旧生代和年老代,新生代可用的gc方式有:串行gc(Serial Copying),并行回收gc(Parellel Scavenge),并行gc(ParNew),旧生代和年老代可用的gc方式有串行gc(Serial MSC),并行gc(Parallel MSC),并发gc(CMS)。 二.回收方式的选择 jvm有client和server两种模式,这两种模式的gc默认方式是不同的: clien模式下,新生代选择的是串行gc,旧生代选择的是串行gc server模式下,新生代选择的是并行回收gc,旧生代选择的是并行gc 一般来说我们系统应用选择有两种方式:吞吐量优先和暂停时间优先,对于吞吐量优先的采用server默认的并行gc方式,对于暂停时间优先的选用并发gc(CMS)方式。 三.CMS gc CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured generation的回收,也就是年老代的回收,目标是尽量减少应用的暂停时间,减少full gc发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代。在我们的应用中,因为有缓存的存在,并且对于响应时间也有比较高的要求,因此希望能尝试使用CMS来替代默认的server型JVM使用的并行收集器,以便获得更短的垃圾回收的暂停时间,提高程序的响应性。 四.full gc full gc是对新生代,旧生代,以及持久代的统一回收,由于是对整个空间的回收,因此比较慢,系统中应当尽量减少full gc的次数。 如下几种情况下会发生full gc: 《旧生代空间不足 《持久代空间不足 《CMS GC时出现了promotion failed和concurrent mode failure 《统计得到新生代minor gc时晋升到旧生代的平均大小小于旧生代剩余空间 《直接调用System.gc,可以DisableExplicitGC来禁止 《存在rmi调用时,默认会每分钟执行一次System.gc,可以通过-Dsun.rmi.dgc.server.gcInterval=3600000来设置大点的间隔。 五.示例 下面对如下的参数进行分析: JAVA_OPTS="-server -Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m -XX:SurvivorRatio=4 -verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log -Djava.awt.headless=true -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Dsun.rmi.dgc.server.gcInterval=600000 -Dsun.rmi.dgc.client.gcInterval=600000 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15" -Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m Xms,即为jvm启动时得JVM初始堆大小,Xmx为jvm的最大堆大小,xmn为新生代的大小,permsize为永久代的初始大小,MaxPermSize为永久代的最大空间。 -XX:SurvivorRatio=4 SurvivorRatio为新生代空间中的Eden区和救助空间Survivor区的大小比值,默认是32,也就是说Eden区是 Survivor区的32倍大小,要注意Survivo是有两个区的,因此Surivivor其实占整个young genertation的1/34。调小这个参数将增大survivor区,让对象尽量在survitor区呆长一点,减少进入年老代的对象。去掉救助空间的想法是让大部分不能马上回收的数据尽快进入年老代,加快年老代的回收频率,减少年老代暴涨的可能性,这个是通过将-XX:SurvivorRatio 设置成比较大的值(比如65536)来做到。 -verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log 将虚拟机每次垃圾回收的信息写到日志文件中,文件名由file指定,文件格式是平文件,内容和-verbose:gc输出内容相同。 -Djava.awt.headless=true Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。 -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 设置gc日志的格式 -Dsun.rmi.dgc.server.gcInterval=600000 -Dsun.rmi.dgc.client.gcInterval=600000 指定rmi调用时gc的时间间隔 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 采用并发gc方式,经过15次minor gc 后进入年老代 六.一些常见问题 1.为了避免Perm区满引起的full gc,建议开启CMS回收Perm区选项: 3.遇到两种fail引起full gc:Prommotion failed和Concurrent mode failed时: [ParNew (promotion failed): 320138K->320138K(353920K), 0.2365970 secs]42576.951: [CMS: 1139969K->1120688K( 166784K), 9.2214860 secs] 1458785K->1120688K(2520704K), 9.4584090 secs] 这个问题的产生是由于救助空间不够,从而向年老代转移对象,年老代没有足够的空间来容纳这些对象,导致一次full gc的产生。解决这个问题的办法有两种完全相反的倾向:增大救助空间、增大年老代或者去掉救助空间。 Concurrent mode failed的日志大概是这样的 (concurrent mode failure): 1228795K->1228598K(1228800K), 7.6748280 secs] 1911483K->1681165K(1911488K), [CMS Perm : 225407K->225394K(262144K)], 7.6751800 secs] 问题的产生原因是由于CMS回收年老代的速度太慢,导致年老代在CMS完成前就被沾满,引起full gc,避免这个现象的产生就是调小-XX:CMSInitiatingOccupancyFraction参数的值,让CMS更早更频繁的触发,降低年老代被沾满的可能。
CMS并非没有暂停,而是用两次短暂停来替代串行标记整理算法的长暂停,它的收集周期是这样:
初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep) ->并发重设状态等待下次CMS的触发(CMS-concurrent-reset)。
其中的1,3两个步骤需要暂停所有的应用程序线程的。第一次暂停从root对象开始标记存活的对象,这个阶段称为初始标记;第二次暂停是在并发标记之后,暂停所有应用程序线程,重新标记并发标记阶段遗漏的对象(在并发标记阶段结束后对象状态的更新导致)。第一次暂停会比较短,第二次暂停通常会比较长,并且 remark这个阶段可以并行标记。
而并发标记、并发清除、并发重设阶段的所谓并发,是指一个或者多个垃圾回收线程和应用程序线程并发地运行,垃圾回收线程不会暂停应用程序的执行,如果你有多于一个处理器,那么并发收集线程将与应用线程在不同的处理器上运行,显然,这样的开销就是会降低应用的吞吐量。Remark阶段的并行,是指暂停了所有应用程序后,启动一定数目的垃圾回收进程进行并行标记,此时的应用线程是暂停的。
+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
2.默认CMS是在tenured generation沾满68%的时候开始进行CMS收集,如果你的年老代增长不是那么快,并且希望降低CMS次数的话,可以适当调高此值:
-XX:CMSInitiatingOccupancyFraction=80
Prommotion failed的日志输出大概是这样:
发表评论
-
预估GC频率的方法
2012-10-15 16:10 1125我们在进行GC调优的 ... -
GC调优及awk脚本分析GC日志
2012-03-15 16:22 0原有GC参数 JAVA_OPTS=&qu ... -
了解CMS(Concurrent Mark-Sweep)垃圾回收器
2012-03-15 15:18 01.总体介绍: CMS(Concur ... -
JVM参数调优,无停滞实践
2012-03-15 11:38 0JVM参数调优是个很头痛的问题,设置的不好,JVM不断执行Fu ... -
JVM系列五:JVM监测&工具[整理中]
2012-03-15 10:04 0前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产 ... -
JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
2012-03-15 10:03 0java application项目(非web项目) ... -
JVM系列二:GC策略&内存申请、对象衰老
2012-03-15 10:02 0JVM里的GC(Garbage Collection)的算法 ... -
JVM系列一:JVM内存组成及分配
2012-03-15 10:01 0java内存组成介绍:堆(Heap)和非堆(Non-hea ... -
HotSpot VM GC 的种类
2012-03-15 10:00 0collector种类 ... -
JVM系列三:JVM参数设置、分析
2012-03-15 09:40 0不管是YGC还是Full GC,GC过程中都会对导致程序运行中 ... -
JVM GC日志和内存DUMP参数配置
2012-03-15 08:03 0在JVM出现内存溢出或泄 ... -
一次Java垃圾收集调优实战
2012-03-14 10:46 01 资料 JDK5.0垃圾收集优化之--Don't P ... -
CMS gc实践总结
2012-03-14 10:44 0首先感谢阿宝 同学的帮助,我才对这个gc算法的调整有了一定的 ... -
工具分析GC日志
2012-03-14 10:37 0工具分析GC日志 ... -
JVM监控工具介绍
2012-03-13 15:45 0转: jstack -- 如果java程序崩溃生 ... -
多线程性能调优
2012-02-25 08:40 01、性能调优的步骤1.1、 ... -
GC
2011-09-30 11:21 1139转:http://www.iteye.com/topic/97 ... -
java jvm GC 参数设置
2011-04-02 14:27 1312来自:http://yefeng.iteye.com/blog ...
相关推荐
Java虚拟机(JVM)是Java程序运行的基础,它的配置参数和垃圾收集(GC)机制对于优化应用程序性能至关重要。本文将深入探讨JVM参数及其与Java垃圾收集相关的知识。 一、JVM参数详解 JVM参数可以分为三类:启动参数...
通过调整JVM参数,例如设置堆大小、新生代与老年代的比例、GC策略等,可以有效地避免内存溢出和性能瓶颈。 在进行内存分析时,MAT的几个关键功能不容忽视: - Leak Suspects报告:MAT会自动分析heap dump,提供...
"jvmgc日志分析工具"专为解析和可视化JVM生成的GC日志而设计,帮助开发者识别内存瓶颈,调整内存设置,以及诊断可能的性能问题。 GC日志是JVM在运行过程中记录的关于垃圾收集活动的详细信息,包括垃圾收集的起始...
本文将深入探讨JVM的常用参数设置,以及它们如何影响Java应用程序的运行。 一、JVM内存设置 1. **堆内存**: - `-Xms`:初始堆大小,例如`-Xms256m`表示初始分配256MB内存。 - `-Xmx`:最大堆大小,例如`-Xmx...
5. **GC调优**:包括如何分析GC日志,理解GC停顿(Stop-the-World)事件,以及如何通过调整JVM参数来改善系统性能,如设置堆大小、新生代与老年代的比例、存活代的晋升策略等。 6. **性能监控与诊断工具**:如...
5. **JVM调优**:通过调整JVM参数,可以控制GC的行为,例如设置堆大小、新生代和老年代的比例、GC策略等。常用的JVM参数有`-Xms`, `-Xmx`, `-Xmn`, `-XX:NewRatio`, `-XX:SurvivorRatio`, `-XX:+UseConcMarkSweepGC`...
通过对GC日志的分析,我们可以理解哪些操作导致了频繁的Full GC,从而调整堆大小、设置合适的GC策略,或者优化代码以减少不必要的内存消耗。 总的来说,理解并监控Java应用的JVM GC频率是保障系统稳定性、性能和...
JVM参数设置是优化Java应用性能的关键环节,它可以帮助我们控制JVM的行为,如内存分配、垃圾回收策略、线程调度等。下面将详细介绍一些重要的JVM参数及其作用。 1. 内存设置: - `-Xms` 和 `-Xmx`:这两个参数用于...
### JVM参数设置详解 在Java应用开发与维护过程中,JVM(Java虚拟机)的配置至关重要,它直接影响到应用程序的性能表现与稳定性。本文将基于提供的文件内容,深入解析Linux环境下JVM的基本参数设置方法及原理。 ##...
- **调优参数**:例如`-Xms`、`-Xmx`设定堆大小,`-XX:NewRatio`设置年轻代与老年代比例,`-XX:+UseConcMarkSweepGC`选择特定的GC算法。 - **性能指标**:关注吞吐量、响应时间、暂停时间等,根据应用需求平衡这些...
1. **JVM参数设置**:根据应用需求,设置合适的JVM启动参数,如堆大小(`-Xms`和`-Xmx`)、新生代与老年代的比例(`-XX:NewRatio`)、Eden区与Survivor区的比例(`-XX:SurvivorRatio`)、GC日志输出(`-XX:+...
开发者可以通过调整JVM参数,如设置年轻代与老年代的比例、分配的Region数量、暂停时间目标等,来优化G1 GC的行为,从而达到更好的系统性能。 总之,《深入理解JVM & G1 GC》这本书为读者提供了理解JVM内存模型和G1...
若要生成heap dump文件,可使用`jmap`命令,或者设置JVM参数`-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath`使得在出现内存溢出时自动创建dump文件。 `jstat`是另一个重要的监控工具,能实时展示虚拟机的运行...
3. 日志与监控:为了分析和调优,我们需要获取GC日志,这可以通过-XX:+PrintGC、-XX:+PrintGCDetails和-XX:+PrintHeapAtGC等参数实现。同时,使用合适的查看工具也很重要。 这里提到的“查看工具”是指用于监控和...
优化GC策略通常包括调整JVM启动参数,如-server模式、堆内存大小、新生代与老年代的比例等。例如,通过-Xms和-Xmx参数可以设置堆的初始大小和最大大小。-Xmn参数可以用来设置新生代大小,而-XX:PermSize和-XX:...
- **作用**:此参数用于指定GC日志的输出位置,便于后续对日志文件进行分析。 - **示例输出**:该参数本身不直接输出信息,而是指定了日志文件的路径,如“log/gc.log”。 #### 三、堆的分配参数 ##### -Xms 和 -...
本实践案例中,作者分别尝试了三种不同的垃圾回收(GC)策略:串行回收、并行回收和并发回收,并针对每种策略提供了具体的JVM参数配置。 一、串行垃圾回收 这是JVM的默认配置,主要适用于轻量级应用或低CPU核心数的...
- **命令行参数**:IBM JVM支持通过命令行参数来配置GC的行为,例如设置初始堆大小、最大堆大小、启用/禁用特定的GC策略等。 ### 结论 IBM JVM的GC技术文档全面而深入地介绍了IBM JVM在内存管理和垃圾回收方面的...
2. 配置暂停时间目标:通过`-XX:MaxGCPauseMillis`参数设置期望的最大暂停时间。 3. 调整并行线程数:通过`-XX:ParallelGCThreads`调整G1的并行线程数,以适应不同的硬件配置。 4. 开启String去重复功能:`-XX:+...
诊断这类问题时,首先要确认是否选择了合适的GC策略,其次要检查堆内存的大小设置是否恰当,最后还要分析具体的应用行为和垃圾回收日志,识别出是哪种类型的问题,比如内存泄露、对象分配过快等。 6. 使用IBM JDK的...