`
rather_lonely
  • 浏览: 97458 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

垃圾回收器机制和eclipse.ini参数关系

 
阅读更多
JVM gc参数设置与分析
一.概述

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使用的并行收集器,以便获得更短的垃圾回收的暂停时间,提高程序的响应性。
    CMS并非没有暂停,而是用两次短暂停来替代串行标记整理算法的长暂停,它的收集周期是这样:
    初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep) ->并发重设状态等待下次CMS的触发(CMS-concurrent-reset)。
    其中的1,3两个步骤需要暂停所有的应用程序线程的。第一次暂停从root对象开始标记存活的对象,这个阶段称为初始标记;第二次暂停是在并发标记之后,暂停所有应用程序线程,重新标记并发标记阶段遗漏的对象(在并发标记阶段结束后对象状态的更新导致)。第一次暂停会比较短,第二次暂停通常会比较长,并且 remark这个阶段可以并行标记。

    而并发标记、并发清除、并发重设阶段的所谓并发,是指一个或者多个垃圾回收线程和应用程序线程并发地运行,垃圾回收线程不会暂停应用程序的执行,如果你有多于一个处理器,那么并发收集线程将与应用线程在不同的处理器上运行,显然,这样的开销就是会降低应用的吞吐量。Remark阶段的并行,是指暂停了所有应用程序后,启动一定数目的垃圾回收进程进行并行标记,此时的应用线程是暂停的。



四.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区选项:
+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
2.默认CMS是在tenured generation沾满68%的时候开始进行CMS收集,如果你的年老代增长不是那么快,并且希望降低CMS次数的话,可以适当调高此值:
-XX:CMSInitiatingOccupancyFraction=80

3.遇到两种fail引起full gc:Prommotion failed和Concurrent mode failed时:
Prommotion 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更早更频繁的触发,降低年老代被沾满的可能。

分享到:
评论

相关推荐

    运行eclipse提示JVM错误的解决

    为了避免每次垃圾回收之后调整堆内存大小带来的性能损耗,通常建议将`-Xms`和`-Xmx`设置为相同的值。 #### 三、问题分析与解决 ##### 1. 分析 出现“jvm terminated. Exit code=-1”的错误提示,通常是由于JVM...

    解决 Eclipse内存不足的问题

    当Eclipse运行大型项目或者打开大量文件时,如果初始分配的内存不足,就会触发JVM的垃圾回收机制,甚至可能导致内存溢出错误(OutOfMemoryError)。 解决这个问题的第一步是找到eclipse.ini文件。该文件位于Eclipse...

    eclipse内存优化

    为了保持性能稳定,通常建议将Xms和Xmx设置为相同值,避免每次垃圾回收后动态调整堆大小带来的开销。 ##### 非堆内存分配 - **XX:PermSize**:设定非堆内存的初始大小,默认为物理内存的1/64。 - **XX:MaxPermSize...

    eclipse性能优化 <深度理解jvm>读书笔记

    在本文中,我们将探讨Eclipse的性能调优策略,以及JVM内存管理和垃圾回收机制等相关知识点。 首先,Eclipse作为一款强大的Java开发工具,其性能优化主要包括以下几个方面: 1. **启动速度优化**:可以通过减少工作...

    ECLIPSE,TOMCAT,JVM内存设置

    标题 "ECLIPSE,TOMCAT,JVM内存设置" 涉及到的是...同时,对于大型项目和高并发场景,还需要关注垃圾回收机制(GC)的配置,例如选择合适的垃圾收集器、调整新生代和老年代的比例等。这些都属于Java性能优化的重要环节。

    MyEclipse内存不足谈谈JVM内存

    它是Java应用程序的主要存储区域,也是垃圾回收器主要工作的区域。JVM在启动时会自动分配堆内存。 - **非堆内存(Non-Heap)**:也被称为永久代(Permanent Generation)或者元空间(Metaspace),用于存储类定义、常量池...

    eclipse开发性能优化、java代码性能优化

    - 对于大型项目,考虑使用 Maven 或 Gradle 等构建工具,它们能够更高效地管理依赖关系和构建过程。 **5. 软件版本** - 使用最新版本的 Eclipse 和 JDK,这些版本往往包含了性能改进和bug修复。 - 根据实际需求...

    myeclipse0经常出现卡死现象的解决设置.docx

    文档中提到了`-XX:+UseParallelGC`参数,这是一个针对1.5 JDK及以上版本、双核CPU的垃圾回收机制优化选项。如果硬件条件不符,比如单核CPU或JDK版本过低,使用此参数可能会导致错误。因此,确保你的硬件配置和JDK...

    提高MyEclipse6.5的性能

    - 添加`-XX:+UseParallelGC`来启用并行垃圾回收机制。 #### 九、清理Java环境 MyEclipse可能配置了多个JRE版本,其中一些可能不再使用。清理无用的JRE可以减少资源占用: 1. **路径**:Window &gt; Preferences &gt; ...

    MyEclipse优化

    建议将`-Xms`设置为与`-Xmx`相同的值,这样可以在垃圾回收后避免因重新分配内存而造成的资源浪费。 例如,在`myeclipse.ini`文件中,你可以设置如下: ```ini -vmargs -Xmx1024m -Xms1024m ``` 这表示MyEclipse...

    系统内存不足引起异常的解决方法

    1. **内存泄露**:应用程序中有未被正确释放的对象,导致垃圾回收机制无法回收它们占用的内存。 2. **内存分配不足**:启动JVM时分配给它的最大堆内存太小,不足以支持应用程序的正常运行。 3. **永久代(PermGen)...

    java excel导出tomcat内存溢出处理方法

    1. **合理设置-Xmn参数**:`-Xmn`用于设置年轻代的大小,合理的年轻代大小可以有效减少垃圾回收的频率,提高程序运行效率。 2. **区分-Xms和-Xmx**:`-Xms`是初始分配的堆内存大小,`-Xmx`是最大分配的堆内存大小,...

    详解Java的堆内存与栈内存的存储机制

    垃圾回收器(Garbage Collector, GC)负责监控并回收不再使用的对象,以防止内存泄漏。 - **动态分配**:堆内存的大小在程序运行时可以动态调整,无需预先告诉编译器。 - **性能**:由于堆内存的动态分配特性,其...

    MyEclipse6.5优化

    3. 启用并行垃圾回收:`-XX:+UseParallelGC`。 4. 如果发现永久代空间不足,可以适当增加`-XX:MaxPermSize`的值。 #### 九、清理无用的JDK安装 如果安装了多个版本的JDK,而有些版本不再使用,可以通过以下方式清理...

    jetty 事例

    - 配置JVM:适当调整JVM参数,如堆大小、垃圾回收策略,可以进一步提升Jetty的性能。 7. **监控与管理** - JMX支持:Jetty支持JMX(Java Management Extensions),可以通过JMX工具监控和管理Jetty实例。 - ...

Global site tag (gtag.js) - Google Analytics