近日开始关注JVM的问题,先用jstat -gcutil pid随意看了一套web系统的JVM情况(容器是tomcat 7,jdk是1.7),结果非常惊讶,Full GC频繁,且周期性出现。
问题出现了,好兴奋啊,搞定它我就能增长经验了哇!!于是乎,和我们亲爱的SA同事交流了一番,我用nohup jstat -gccause pid 1s >> ~/xxx/xxx.log &先把gccause日志记录下来,经过半天日志记录追踪之后,发现LGCC是System.gc()。很好奇怎么会出现这东西,我写的代码肯定没有System.gc(),有点怀疑是tomcat的问题(当时也只是怀疑,无任何根据的)。为了解决这个问题,我先尝试在JVM启动参数中加入-XX:+DisableExplicitGC来禁止System.gc(),大半天后再用jstat看gc情况,FGC的次数是0,然后问题解决了。
虽然问题临时解决了,为了知其然知其所以然,我继续深究了一番,最终找到了问题所在:是tomcat 7的一个默认配置(JreMemoryLeakPreventionListener)所导致的,更合适的解决方法似乎是 <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>。
以下是引用的内容,原文网址在:http://mail-archives.apache.org/mod_mbox/tomcat-users/201008.mbox/%3CAANLkTino=BjP5LsBCwncB2HvNDzyKLr5y-8yWdt15a89@mail.gmail.com%3E
Thank you Konstantin and Chris for your attention. As stated in the initial post: 'We have recently deployed tomcat-6.0.28 in our organization and are noticing every hour, a Full GC is occurring. The same application, same JVM, same JVM args, just a new tomcat release.' Using the default JreMemoryLeakPreventionListener configuration that has 'gcDaemonProtection=true' will result in 1hr FullGCs using Sun 1.6 b18, b20 and b21on Solaris and Windows. We've tested and successfully 'contained' the FullGC behavior using one of the below configurations: 1) suppress the FullGC using JVM arg -XX:+DisableExplicitGC 2) keep the FullGC but to defer to the CMS collector using JVM arg -XX:+ExplicitGCInvokesConcurrent 3) <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/> 4) Disable the listener altogether We've decided to go with option 3.
相关推荐
对于某些动态加载类的应用程序来说,适当增大持久代可以避免频繁的Full GC。 #### 四、GC类型及其触发条件 1. **Scavenge GC**:主要针对年轻代进行的局部GC操作,当Eden区空间不足时触发,目的是清理不再使用的...
【Tomcat7优化】 Tomcat7是Apache Tomcat服务器的一个版本,主要负责运行Java Servlets和JavaServer Pages(JSP)。优化Tomcat7的目标是为了提高网站的并发处理能力,确保在高流量环境下仍然能保持良好的响应速度和...
2. 垃圾收集器选择:对于高并发场景,可以选择Concurrent Mark Sweep (CMS) 或 G1 Garbage Collector,以降低Full GC的频率,提高响应速度。 3. 编译器设置:启用Server模式的HotSpot编译器,通过`-XX:+UseServerGC...
在使用Tomcat运行Java Web应用程序时,可能会遇到一个常见的问题:`System.out.println()` 输出突然停止,仿佛被中断了一样。这种情况通常是由于多种因素引起的,包括但不限于以下几点: 1. **日志重定向**:Tomcat...
- **调整JVM参数**:优化Java虚拟机(JVM)的堆内存分配、垃圾回收策略等,例如增大年轻代和老年代的内存比例,减少Full GC的频率。 - **压缩HTTP响应**:开启GZIP压缩,减小传输的数据量,提高网络传输效率。 - **...
- **避免频繁Full GC**:如果发现系统经常触发Full GC,可能是内存配置不合理。此时,应考虑适当增加内存大小或者优化代码逻辑。 - **利用最新的JDK特性**:随着JDK版本的更新,一些旧的参数已被新参数替代,比如`-...
例如,如果发现应用频繁发生Full GC,可能意味着堆内存设置不当,或者存在内存泄漏。 进一步分析GC日志,GCViewer可以帮助我们理解以下关键概念: 1. **年轻代和老年代**:Java对象在内存中的生命周期分为新生代和...
- `-XX:NewSize`和`-XX:MaxNewSize`分别设置年轻代的初始和最大大小,较大的新对象区可以减少Full GC的发生。 - `-XX:NewRatio`设定新旧空间的比例,默认为8,意味着新空间是旧空间的1/8。 - `-XX:SurvivorRatio`...
如果堆大小过大,完全垃圾收集(FULL GC)会比较慢但频率较低;反之,则完全收集较快但更频繁。目标是尽可能减少垃圾收集所消耗的时间,以提高处理客户端请求的效率。 ##### 3.2 操作系统性能优化 操作系统层面的...
### Tomcat 安装、配置及调优详解 ...5. **监控与日志:** 定期检查Tomcat的日志文件,分析潜在的问题并及时解决。 通过以上步骤,我们可以有效地对Tomcat服务器进行配置和优化,确保其高效稳定地运行。
2. **改进的内存管理**:JDK 1.6的垃圾回收机制得到了优化,减少了Full GC的频率,提高了整体性能。 3. **NIO.2(New I/O 2)**:引入了新的文件系统API,增加了异步I/O操作,提高了文件处理效率。 4. **动态代理*...
- **开启详细 GC 日志** (`-XX:+PrintGCDetails`, `-XX:+PrintGCTimeStamps`, `-XX:+PrintGCDateStamps`, `-Xloggc`): 便于监控 GC 活动,分析 GC 性能问题。 - **堆转储** (`-XX:+HeapDumpOnOutOfMemoryError`): ...
2. 堆内存分配:根据应用需求调整年轻代和老年代的比例,减少Full GC的发生。 3. 类加载机制:理解并优化类加载器,减少内存占用和提高加载速度。 二、线程池优化 1. 设置合理的最大线程数:根据服务器硬件资源和...
例如,`-Xloggc:/var/log/search/tomcat_gc.log` 将GC日志记录到 `/var/log/search/tomcat_gc.log` 文件中。 #### 三、垃圾回收机制 ##### 3.1 基本回收算法 - **标记-清除(Mark-Sweep)**: 该算法首先标记所有...
JVM优化入门,优化tomcat执行效率...基于CMS是用于对tenured generation的回收,也就是年老代的回收,目标是尽量减少应用的暂停时间,减少full gc发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代。
在实际应用中,Apache Tomcat作为一款广泛使用的Java应用程序服务器,在部署和运行过程中经常会遇到性能瓶颈或者资源管理的问题。为了提高Tomcat的应用效率和服务质量,进行合理的微调是非常必要的。本文将围绕如何...
合理的堆大小分配可以避免频繁的Full GC,提高系统稳定性。例如,`-Xms`和`-Xmx`分别用于设置初始堆大小和最大堆大小,而`-XX:NewRatio`可以调整新生代和老年代的比例。 垃圾收集器的选择直接影响到应用的响应时间...
在优化Apache Tomcat服务器以...注意,过大的内存设置可能会导致垃圾收集器效率降低,而过小的设置可能导致频繁的Full GC,所以找到一个合适的平衡点至关重要。此外,定期分析GC日志和性能监控数据也是调优的重要环节。
- **-XX:+DisableExplicitGC**: 禁止应用程序显式调用System.gc(),避免不必要的Full GC操作。 - **-XX:MaxTenuringThreshold**: 设置对象在年轻代的最大存活周期,有助于控制对象晋升到老年代的时机。 - **-XX:+...
在Tomcat运行过程中,如果Apache的`MaxClients`值过大,可能会导致频繁的Full GC,影响服务的稳定性和响应速度。 3. **JVM内部机制**:Java虚拟机是Java应用程序的运行环境,负责类的加载、运行、内存管理等。理解...