1 设置方法

通过直接对编辑jdk进行设置

也可以在在Debug Configration中对特定工程进行设置,如下图:

2 常用设置及其含义

常用设置:1)  -Xmx3550m -Xms3550m -Xmn2g -Xss128k

2)  -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

设置项解释:
-Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 
-XX:NewRatio=4: 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxPermSize=16m:设置持久代大小为16m。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的机率。

3 虚拟机参数设置使用场景举例

网站在使用过程中出现周期性卡顿,于是用Jstat查看虚拟机的各项指标,发现FullGc耗时很大,说明虚拟机频繁进行fullGc导致卡顿

分析原因及解决办法:

1. 旧生代空间不足

旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:

  1. java.lang.OutOfMemoryError: Java heap space

为避免以上两种状况引起的Full GC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

2. Permanet Generation空间满

Permanet Generation中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:

  1. java.lang.OutOfMemoryError: PermGen space

为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。

3. CMS GC时出现promotion failed和concurrent mode failure

对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。

promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入旧生代,而此时旧生代也放不下造成的;concurrent mode failure是在执行CMS GC的过程中同时有对象要放入旧生代,而此时旧生代空间不足造成的。

应对措施为:增大survivor space、旧生代空间或调低触发并发GC的比率,但在JDK 5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕后很久才触发sweeping动作。对于这种状况,可通过设置-XX: CMSMaxAbortablePrecleanTime=5(单位为ms)来避免。

4. 统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间

这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。

例如程序第一次触发Minor GC后,有6MB的对象晋升到旧生代,那么当下一次Minor GC发生时,首先检查旧生代的剩余空间是否大于6MB,如果小于6MB,则执行Full GC。

当新生代采用PS GC时,方式稍有不同,PS GC是在Minor GC后也会检查,例如上面的例子中第一次Minor GC后,PS GC会检查此时旧生代的剩余空间是否大于6MB,如小于,则触发对旧生代的回收。

除了以上4种状况外,对于使用RMI来进行RPC或管理的Sun JDK应用而言,默认情况下会一小时执行一次Full GC。可通过在启动时通过- java -Dsun.rmi.dgc.client.gcInterval=3600000来设置Full GC执行的间隔时间或通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

解决办法参考自:http://book.51cto.com/art/201011/235592.htm

JVM调优得看gc log,然后针对性分析、调优。没有通用的、一劳永逸的方案。

转载于:https://www.cnblogs.com/bravecode/p/10613412.html

eclipse中对于Java虚拟机参数的设置与思考相关推荐

  1. sts html自动提醒,STS、Eclipse中编写java、html、javascript文件的自动提示设置 html标签属性提示 总结...

    总结:STS.Eclipse中编写java.html.javascript文件的自动提示设置 html标签属性提示 解决方案: 一.HTML ①鼠标右键点击创建的文件,选择[Properties] ② ...

  2. eclipse java 7_在Eclipse中编程Java 7

    我安装了JDK 7和Eclipse 3.6M6.然后,我将JRE 7添加为Eclipse中的新JRE执行环境,并将编译器的遵从性级别设置为Java7.我可以使用javacJDK 7随附的命令行通过命令 ...

  3. eclipse无法创建java虚拟机_手把手:Java内存泄漏分析Memory Analyzer Tool

    点击上方"IT牧场",选择"设为星标"点击上方"IT牧场",选择"设为星标"技术干货每日送达 阅读文本大概需要3分钟. ...

  4. 在eclipse中安装properties插件PropertiesEditor及设置(附图),ASCII码转换成中文

    在eclipse中安装properties插件PropertiesEditor及设置(附图),ASCII码转换成中文 安装成功后ASCII还是不能转换成中文的,原因是设置里面没有把编码设置为utf8的 ...

  5. eclipse中进行java编程时,CTRL+左键时,看不到源码的解决方法。

    第一种情况:eclipse中进行java编程时,CTRL+左键时,没有任何反应,解决方法: 设置方法:window-->preferences-- >General-->Editor ...

  6. 【eclipse中配置java】

    在eclipse中配置jdk Window–>Preferences–>java–>installed JREs–>add–>Standard VM–>选择jdk安 ...

  7. 怎么在eclipse中调试java程序?

    怎么在eclipse中调试java程序?关于这个问题我已经回答过很多次,但许多朋友可能还没有理解,本篇文章再来详细为大家解答一下怎么在eclipse中调试java程序?等相关问题,希望对大家有所帮助. ...

  8. java虚拟机参数-X 与 -XX的区别

    java虚拟机参数-X 与 -XX的区别 java虚拟机参数-X 与 -XX的区别 为什么有的用-X 如,-Xms -Xmx -Xmn等 有的用-XX: 如-XX:MaxPermSize=100M等 ...

  9. 在Eclipse中导入Java程序

    在Eclipse中导入Java程序 在 Eclipse 中导入 Java 程序 在 Eclipse 中导入 Java 程序,分导入Java Project和导入Java源程序 两种情况,简述如下. 情 ...

最新文章

  1. Linux开机详细流程
  2. mysql ndb_mysql8 参考手册--MySQL NDB群集8.0
  3. 时钟源为什么会影响性能
  4. 是什么时候开始学习gulp了
  5. 【联盛德W806上手笔记】五、TIM定时器
  6. 数组乱码_python 爬虫随笔-土办法治乱码
  7. response.sendRedirect(quot;http://www.baidu.comquot;);重定向
  8. 中文编程对中文编程是否是一枚银弹
  9. 利用python爬虫爬百度百聘招聘数据----利用Ajax的方式抓取
  10. nds android7.0模拟器,NDS用MD模拟器jEnesisDS 0.7
  11. PR字幕模板 简单大气红色创意图形动态字幕条全屏标题pr模板
  12. githut 的 管理 使用
  13. 使用Reverse SSH Tunnel实现内网穿透的可行性方案
  14. 广州蓝景分享—Web前端开发培训机构如何选择
  15. Jenkins搭建前后端分离项目流水线实战
  16. 米家APP又崩了,智能家居还可靠吗?
  17. java开发环境(java开发环境和运行环境)
  18. JSP+Servlet+C3P0+Mysql实现的网上蛋糕店
  19. 嵌入式C语言自我修养:从芯片、编译器到操作系统(附送书籍)
  20. 完全免费的文件恢复工具

热门文章

  1. 《scikit-learn》xgboost
  2. 漫步数学分析十三——路径连通
  3. mongodb模糊查询_MongoDB技术从0到1+
  4. 基于视觉的烟雾/火焰检测数据集整理(检测、识别、分割)
  5. 【转载】javascript,声明变量和导入时,大括号的特殊用法
  6. 计算机网络——数据帧和数据包的区别
  7. pytorch —— 模型容器与AlexNet构建
  8. matlab用卷积积分求单自由度阻尼系统响应(零极点模型)
  9. Unity 脚本生命周期流程图
  10. 计算机视觉基础-图像处理(图像滤波)cpp+python