1.JVM参数:

  • -Xms : JVM初始分配的堆内存大小,默认是物理内存的1/64;默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。

  • -Xmx : JVM最大分配的堆内存大小,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;

因此我们一般设置-Xms、-Xmx这两个参数相等,可以避免在每次GC 后动态调整堆的大小带来的影响。

  • -Xmn:新生代大小
  • -Xss:每个线程池的堆栈大小。在jdk5以上的版本,每个线程堆栈大小为1m,jdk5以前的版本是每个线程池大小为256k。一般在相同物理内存下,如果减少-xss值会产生更大的线程数,但不同的操作系统对进程内线程数是有限制的,是不能无限生成。
  • -XX:NewRatio:设置新生代与老年代比值,-XX:NewRatio=4 表示新生代与老年代所占比例为1:4 ,新生代占比整个堆的五分之一。如果设置了-Xmn的情况下,该参数是不需要在设置的。
  • -XX:PermSize:设置持久代初始值,默认是物理内存的六十四分之一
  • -XX:MaxPermSize:设置持久代最大值,默认是物理内存的四分之一
  • -XX:MaxTenuringThreshold:新生代中对象存活次数,默认15。(若对象在eden区,经历一次MinorGC后还活着,则被移动到Survior区,年龄加1。以后,对象每次经历 MinorGC,年龄都加1。达到阀值,则移入老年代)
  • -XX:SurvivorRatio:Eden 区与 Survivor 区大小的比值,如果设置为8,两个 Survivor 区与一个Eden区的比值为2:8,一个Survivor区占整个新生代的十分之一
  • -XX:+UseFastAccessorMethods:原始类型快速优化
  • -XX:+AggressiveOpts:编译速度加快
  • -XX:PretenureSizeThreshold:对象超过多大值时直接在老年代中分配
注意:  整个堆大小的计算公式: JVM 堆大小 = 年轻代大小+年老代大小+持久代大小。
增大新生代大小就会减少对应的年老代大小,设置-Xmn值对系统性能影响较大,所以如果设置新生代大小的调整,则需要严格的测试调整。
而新生代是用来存放新创建的对象,大小是随着堆大小增大和减少而有相应的变化,默认值是保持堆大小的十五分之一,-Xmn参数就是设置新生代的大小,
也可以通过-XX:NewRatio来设置新生代与年老代的比例,java 官方推荐配置为3:8。
新生代的特点就是内存中的对象更新速度快,在短时间内容易产生大量的无用对象,如果在这个参数时就需要考虑垃圾回收器设置参数也需要调整。
推荐使用: 复制清除算法和并行收集器进行垃圾回收,而新生代的垃圾回收叫做初级回收。StackOverflowError 和 OutOfMemoryException。当线程中的请求的栈的深度大于最大可用深度,就会抛出前者;若内存空间不够,无法创建新的线程,则会抛出后者。
栈的大小直接决定了函数的调用最大深度,栈越大,函数嵌套可调用次数就越多。相关经验:
1.Xmn用于设置新生代的大小。过小会增加Minor GC频率,过大会减小老年代的大小。一般设为整个堆空间的1/4或1/3.
2.XX:SurvivorRatio 用于设置新生代中 survivor 空间(from/to)和 eden 空间的大小比例; XX:TargetSurvivorRatio表示,当经历Minor GC后,survivor空间占有量(百分比)超过它的时候,就会压缩进入老年代(当然,如果survivor空间不够,则直接进入老年代)。默认值为50%。
3.为了性能考虑,一开始尽量将新生代对象留在新生代,避免新生的大对象直接进入老年代。因为新生对象大部分都是短期的,这就造成了老年代的内存浪费,并且回收代价也高(Full GC发生在老年代和方法区Perm).
4.当Xms=Xmx,可以使得堆相对稳定,避免不停震荡
5.一般来说,MaxPermSize设为64MB可以满足绝大多数的应用了。若依然出现方法区溢出,则可以设为128MB。若128MB还不能满足需求,那么就应该考虑程序优化了,减少动态类的产生。

2.垃圾回收

2.1 垃圾回收算法 :

  • 引用计数法: 会有循环引用的问题,古老的方法;
  • Mark-Sweep: 标记清除。根可达判断,最大的问题是空间碎片(清除垃圾之后剩下不连续的内存空间);
  • Copying: 复制算法。对于短命对象来说有用,否则需要复制大量的对象,效率低。如Java的新生代堆空间中就是使用了它(survivor空间的from和to区);
  • Mark-Compact: 标记整理。对于老年对象来说有用,无需复制,不会产生内存碎片

2.2 GC考虑的指标

  • 吞吐量: 应用程序耗时和系统总耗时的比值。系统总运行时间=应用程序耗时+GC耗时。(如果系统运行了100分钟,GC耗时1分钟,那么系统的吞吐量就是(100-1)/ 100 = 99%)
  • 停顿时间: 因为 Stop the World,所以垃圾回收的时候,应用程序的所有线程会挂起,造成应用停顿。(对于独占回收器而言,停顿时间可能比较长。使用并发的回收器时,由于垃圾回收和应用程序交替运行,程序的停顿时间会变短,但是因为其效率很可能不如独占垃圾回收器,故系统的吞吐量可能会较低)

吞吐量和停顿时间是互斥的。 对于后端服务(比如后台计算任务),吞吐量优先考虑(并行垃圾回收);

对于前端应用,RT响应时间优先考虑,减少垃圾收集时的停顿时间,适用场景是Web系统(并发垃圾回收)

2.3回收器的JVM参数

  • -XX:+UseSerialGC: 串行垃圾回收(注意:现在基本很少使用这个)
  • -XX:+UseParNewGC: 新生代使用并行,老年代使用串行
  • -XX:+UseConcMarkSweepGC: 新生代使用并行,老年代使用 CMS(CMS是 Concurrent Mark Sweep 的缩写,并发标记清除)。CMS 不是独占式的,它比较关注停顿时间)
  • -XX:ParallelGCThreads: 并行的垃圾回收线程的数量(最好等于 CPU 数量)
  • -XX:+DisableExplicitGC: 禁用 System.gc(),因为它会触发 Full GC,导致降低性能,JVM 会在需要 GC 的时候自己触发 GC
  • -XX:CMSFullGCsBeforeCompaction: 在多少次 GC 后进行内存压缩。因为并行收集器不会对内存空间进行压缩,所以运行一段时间后会产生很多内存碎片,导致运行效率降低
  • -XX:+CMSParallelRemarkEnabled: 降低标记停顿
  • -XX:+UseCMSCompactAtFullCollection: 在每一次 Full GC 时会对老年代区域进行碎片整理,因为 CMS 不会移动内存,所以会导致非常容易地出现内存碎片,从而导致内存不够用
  • -XX:+UseCmsInitiatingOccupancyOnly: 使用手动触发或者自定义触发 cms 回收,同时也会禁止 hostspot 自行触发 CMS GC
  • -XX:CMSInitiatingOccupancyFraction: 使用 CMS 作为垃圾回收算法,使用 70% 后开始 CMS 收集
  • -XX:CMSInitiatingPermOccupancyFraction: 设置 perm gen 使用达到多少百分比时触发垃圾回收,默认是92%
  • -XX:+CMSIncrementalMode: 设置为增量模式
  • -XX:+CmsClassUnloadingEnabled: CMS 默认不会对永久代进行垃圾回收,设置此参数则是开启
  • -XX:+PrintGCDetails: 打印详细的 GC 日志(日志的格式是和所使用的算法相关的)
  • -XX:+PrintGCTimeStamps:打开这个开关后,将额外输出 GC 的发生时间,从而可以知道 GC 的频率和时间间隔
  • -XX:+PrintTenuringDistribution:查看新生对象晋升到老年代的实际阈值
  • -XX:PrintHeapAtGC:打印详细的堆信息,一旦打开它,那么每次GC时,都将打印堆的使用情况
  • -XX:+TraceClassUnloading:用于跟踪类卸载信息
  • -XX:+TraceClassLoading:用于跟踪类加载情况
  • -XX:+PrintGCApplicationStoppedTime :一次垃圾回收,GC的停顿时间
  • -XX:+PrintGCApplicationConcurrentTime:一次垃圾回收,应用程序的执行时间

【JVM】调优参数总结相关推荐

  1. 面试官:你会哪些JVM调优参数?

    关注公众号"Java后端技术全栈" 回复"000"获取程序员必备电子书 <Java 面试辅导>来啦!田哥和你面对面,一对一 规划如何准备面试.模拟真 ...

  2. 美团面试:熟悉哪些JVM调优参数,幸好我准备过!

    关注公众号"Java后端技术全栈" 回复"000"获取程序员必备电子书 大家好,我是田维常,江湖人称老田.田哥.田神,今天来和大家分享JVM调优参数. 之前,我 ...

  3. JVM调优参数与常用工具

    常用的JVM调优参数 -Xms:设置初始堆大小 -Xmx:设置最大堆大小 -Xmn:设置年轻代的大小 -Xss:设置每个线程可使用的内存大小,即栈的大小.在相同物理内存下,减小这个值能生成更多的线程, ...

  4. 转 jdk8 jvm调优参数配置

    转载 jdk8 jvm调优参数配置_feiying00544的博客-CSDN博客_jdk8 jvm参数 1.由于jdk8开始,没有了永久区的概念,所以在jvm参数配置上不再需要 -XX:PermSiz ...

  5. JVM 调优参数详解

     http://yufenfei.iteye.com/blog/1746914 GC有两种类型:Scavenge GC 和Full GC 1.Scavenge GC 一般情况下,当新对象生成,并且 ...

  6. JVM 调优参数总结

    JVM调优小结 杂谈 JVM参数 基本参数 其他参数 指针压缩 逃逸分析 Eden Old 较大对象对直接进入老年代 对象动态年龄判断 老年代空间分配担保机制 垃圾收集器 CMS收集器(-XX:+Us ...

  7. java gc调优常用参数_常用JVM调优参数

    JVM调优有许多参数优化,下面整理了一些我自己能够理解的参数 -XX:AutoBoxCacheMax -XX:+AlwaysPreTouch CMSInitiatingOccupancyFractio ...

  8. 手把手教你设置JVM调优参数

    关注"Java后端技术全栈" 回复"000"获取大量电子书 首先,还是一张思维导图,看看本文主要内容: 今天来熟悉一下,关于JVM调优常用的一些参数. X或者X ...

  9. JVM调优参数与常用调优命令

    文章目录 Java三大性能调优参数 JVM常用内存调优命令 Java三大性能调优参数 java -Xms128m -Xmx128m -Xss256k -jar xxxxx.jar -Xms:堆的初始值 ...

  10. JVM—调优参数学习

    Java堆 1)是一个运行时数据区,类的对象从堆中分配空间:(new对象,GC销毁) 2)堆的优势:运行时动态分配内存空间,不必事先通知编译器.缺点:存取速度慢: 3)举例:String str1 = ...

最新文章

  1. 【设计模式】原型模式 ( 浅拷贝 | 深拷贝 | 原型与单例冲突 | 禁用 final )
  2. 选择头秃还是植发?大数据告诉你植发行业水有多深?
  3. 建智能工厂,可从这6个方面着手!
  4. @Springboot搭建项目controller层接收json格式的对象失败
  5. tensor转换为图片_为大家介绍图片转换pdf的经验总结!你找对方法了吗?
  6. vue js 对象下的原型_如何使用Vue.js和Pusher创建实时原型反馈应用程序
  7. react ---IOS AND ADROID
  8. “鱼渔合作”在IT运维中的启示
  9. 硬件文章远程视频监控
  10. 单服务器高性能:PPC、TPC、epoll、Reactor、Proactor
  11. vsCode常用插件
  12. 次元壁的重塑:当AI主播走进央视演播厅
  13. pytorch-Detach的作用
  14. 数据库sql中S P J SPJ 表的创建
  15. TortoiseSvn介绍(配置与管理)
  16. Android中集成支付宝
  17. 【解决方案】英文论文投稿提交中显示“ unauthorized content”——投稿系统Editorial Manager
  18. 一喝到威士忌真是什么烦恼都忘了
  19. 又是一年植树节,一起为城市添 绿,共赴“春天的约会”
  20. 员工转正述职答辩问什么问题_试用期转正述职报告

热门文章

  1. 短语,直接短语,句柄、最左素短语
  2. jquery 数组sort()排序
  3. UML图系列之序列图
  4. 在office中,使用office的宏合并excel表格
  5. python中函数的可变参数_简单谈谈Python中函数的可变参数
  6. IBM Notes 901FP10IF6发布
  7. 当你无聊时可以做这15件高效的事
  8. 云管理员、云架构师和云应用开发人员的职位描述与工作职责介绍
  9. 跟着王进老师学开发C#篇第二季:面向对象-王进-专题视频课程
  10. 找茬微信小程序源码完整版