堆空间的常用配置

-Xms -Xmx 设置堆空间的大小 推荐设置成相同 -Xmx8G -Xms8G 可以防止JVM动态调整而消耗性能

-Xss512: 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所

需内存大小进行调整。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的

不能无限生成,经验值在3000~5000左右。

---------------堆空间相关配置------------------

-XX:NewSize: -XX:MaxNewSize: 新生代 最大新生代 这个优先级优于下面

-Xmn 相当于 NewSize = MaxNewSize 这个优先级优于下面

-XX:NewRatio=3 意味着年轻代和老年代之间的比率为1:3。也就是说伊甸园和幸存者空间的总大小将是堆总大小的四分之一 这个优先级最低 默认值是2

-XX:SurvivorRatio=8 默认是8 eden:Form:To = 8:1:1 比如:SurvivorRatio=6。那么幸存者空间将是年轻一代的八分之一(而不是七分之一,因为有两个幸存者空间)。

-XX:MetaspaceSize: -XX:MaxMetaspaceSize 元空间大小 JDK8以后使用的本地内存 要控制好范围

-XX:MaxDirectMemorySize=2G 直接内存 默认和堆内存最大值一样 不受java堆大小限制 NIO零拷贝会用到 最好设置约束下

-XX:MaxTenuringThreshold=threshold 设置自适应GC分代中使用的最大使用阈值。最大的值是15。对于并行(吞吐量)收集器,默认值是15,对于CMS收集器,默认值是6。

-XX:-UseTLAB 关闭 TLAB:ThreadLocalAllocBuffer 事先在堆里面为每个线程分配一块私有内存 原子性 默认开启(建议开启)

-XX:TLABSize=512k 设置TLAB的大小

-XX:PretenureSizeThreshold 默认0不管多大都是先在eden中分配内存 当超过eden区的大小的时候,才分配到old区。

大于该值大小的对象直接在老年代分配(单位字节) 自己看着办设置

-XX:+DoEscapeAnalysis 开启逃逸分析 对象作用域逃出函数 就是在方法new了个对象并把这个对象返回出去了 需要配合下面一起才生效 默认开启

-XX:+EliminateAllocations 标量替换 分析出成员变量没有逃逸 把其分配到局部变量也就是栈中 这样就不需要垃圾回收 默认开启

CMS参数配置说明

1、增量收集 -XX:CMSInitiatingOccupancyFraction=80 判断当前 Old 区使用率是否大于阈值,则触发 CMS GC 默认百分之92 降低触发CMS GC的阈值,

让CMS GC尽早执行,以保证有足够的连续空间,也减少 Old 区空间的使用大小

另外需要使用 -XX:+UseCMSInitiatingOccupancyOnly 来配合使用,不然 JVM 仅在第一次使用设定值,后续则自动调整

-XX:+ParallelRefProcEnabled 对 Reference 进行并行处理。

-XX:+CMSClassUnloadingEnabled 这会使得 CMS 在 CMS-Remark 阶段尝试进行类的卸载 对 MetaSpace 或 Perm 进行垃圾收集,默认关闭, ps:最好不要处理

2、内存碎片 -XX:+UseCMSCompactAtFullCollection 来控制 Full GC的过程中是否进行空间的整理(默认开启 是Full GC,不是CMS GC)

-XX:CMSFullGCsBeforeCompaction=0 来控制多少次 Full GC 后进行一次压缩

3、浮动垃圾: 视情况控制每次晋升对象的大小,或者缩短每次 CMS GC 的时间,必要时可调节 NewRatio 的值。

另外就是使用 -XX:+CMSScavengeBeforeRemark 在FullGc过程中提前触发一次 Young GC,防止后续晋升过多对象。

ZGC参数配置说明

-XX:ReservedCodeCacheSize -XX:InitialCodeCacheSize:设置CodeCache的大小, JIT编译的代码都放在CodeCache中,一般服务64m或128m就已经足够。

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC:启用ZGC的配置。

-XX:ConcGCThreads:并发回收垃圾的线程。默认是总核数的12.5%,8核CPU默认是1。调大后GC变快,但会占用程序运行时的CPU资源,吞吐会受到影响。

-XX:ParallelGCThreads:STW阶段使用线程数,默认是总核数的60%。

-XX:ZCollectionInterval:ZGC发生的最小时间间隔,单位秒。

-XX:ZAllocationSpikeTolerance:ZGC触发自适应算法的修正系数,默认2,数值越大,越早的触发ZGC。

-XX:+UnlockDiagnosticVMOptions -XX:-ZProactive:是否启用主动回收,默认开启,这里的配置表示关闭。

GC日志中每一行都注明了GC过程中的信息,关键信息如下:

Start:开始GC,并标明的GC触发的原因。上图中触发原因是自适应算法。

Phase-Pause Mark Start:初始标记,会STW。

Phase-Pause Mark End:再次标记,会STW。

Phase-Pause Relocate Start:初始转移,会STW。

Heap信息:记录了GC过程中Mark、Relocate前后的堆大小变化状况。High和Low记录了其中的最大值和最小值,我们一般关注High中Used的值

如果达到100%,在GC过程中一定存在内存分配不足的情况,需要调整GC的触发时机,更早或者更快地进行GC。

GC信息统计:可以定时的打印垃圾收集信息,观察10秒内、10分钟内、10个小时内,从启动到现在的所有统计信息。利用这些统计信息,可以排查定位一些异常点。

image.png

个人建议

1、设置-Xms -Xmx 设置成一样的大小 减少动态调整分代带来的开销(本地提前测试 一般情况下 永久代的大小应当为活跃对象的 2~3 倍左右,考虑到浮动垃圾问题最好在 3 倍左右,剩下的都可以分给 Young 区)。

2、栈大小一般 256k 就够用了(除非代码中有很深的调用链)。

3、方法区内存: 与堆处于平行的空间 不属于堆和栈。

4、在一个方法区内频繁创建对象 为了避免GC大量回收 可以开启逃逸分析 jdk1.8默认开启。

栈空间的内存 随着线程的销毁而销毁 在栈上分配的对象所以不需要GC。

5、CGLIB技术直接操作字节码运行 生成大量的动态类会导致,jvm堆永久代内存溢出,排查问题困难,在使用的时候一定要谨慎。

6、偏向锁在只有一个线程使用到该锁的时候效率很高,但是在竞争激烈情况会升级成轻量级锁,此时就需要先消除偏向锁,这个过程是 STW 的。如果每个同步资源都走这个升级过程,开销会非常大,所以在已知并发激烈的前提下,一般会禁用偏向锁 -XX:-UseBiasedLocking 来提高性能。

通用配置 (java $通用配置 -jar ***.jar)

-XX:+PrintGCDetails 开启打印GC详细过程 并不会占用什么资源

-XX:+PrintGCTimeStamps | -XX:+PrintGCDateStamps 时间间隔 | 系统时间 方便看GC发生频率

-XX:+HeapDumpOnOutOfMemoryError 发生内存溢出时 自动生成dump日志

-Xloggc:'gc.log' 指定GC日志的地方

-Xlog:safepoint,classhisto*=trace,age*,gc*=info:file=/opt/logs/logs/gc-%t.log:time,tid,tags:filecount=5,filesize=50m

GC日志说明

[图片上传中...(image-c2b5f4-1600391556819)]

java gc配置_JVM通用配置 以及GC日志说明相关推荐

  1. Java内存模型 gc算法_JVM内存模型及GC回收算法

    该篇博客主要对JVM内存模型以及GC回收算法以自己的理解和认识做以记录. 内存模型 GC垃圾回收 1.内存模型 从上图可以看出,JVM分为 方法区,虚拟机栈,本地方法栈,堆,计数器 5个区域.其中最为 ...

  2. java标志清理_JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)...

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  3. java 虚拟内存 堆_jvm虚拟内存分布 与 GC算法

    jvm虚拟内存分布 程序计数器(PC寄存器)(线程私有): 每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器. PC寄存器的内容总是指向下一条将被执行指令的地址 ...

  4. java堆是gc管理_JVM内存管理及GC机制

    一.概述 JavaGC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和 ...

  5. Elasticsearch Java Low Level REST Client(通用配置)

    Elasticsearch Java Low Level REST Client(通用配置) 通用配置 正如初始化中所解释的,RestClientBuilder支持提供RequestConfigCal ...

  6. JVM面试问题系列:JVM 配置常用参数和常用 GC 调优策略

    JVM 配置常用参数 堆参数 回收器参数 如上表所示,目前主要有串行.并行和并发三种,对于大内存的应用而言,串行的性能太低,因此使用到的主要是并行和并发两种.并行和并发 GC 的策略通过 UsePar ...

  7. java gc信息_JVM之GC回收信息详解

    新一代垃圾回收器ZGC设计与实现 70.31元 (需用券) 去购买 > 一.-XX:+PrintGCDetails 打印GC日志 参数配置:-Xms10M -Xmx10M -XX:+PrintG ...

  8. java虚拟机-d参数配置_JVM虚拟机参数介绍

    慢慢学,每天进步一点点,总有一天会变成心目中向往的样子. 在这篇文章中将会介绍常用的JVM参数配置,以及每个参数的含义. 配置堆内存 每一JVM应用程序都有一个非常重要的配置,堆内存的配置,它影响这应 ...

  9. java 程序执行后 强制gc_【GC系列】JVM的常用GC参数及GC日志解析

    今天继续GC系列第三篇,熬夜不易,欢迎一键三连,给个鼓励,不点赞也没关系,我还可以,谢谢捧场[捂脸]. 常见垃圾回收器组合设定 在oracle官网上可以看到如何开启使用指定垃圾回收的命令: https ...

最新文章

  1. HTML封装AJAX请求,在请求里面写登录的逻辑 ajax 网络请求 post
  2. 架构师课程1-多线程基础
  3. XGboost 实战糖尿病预测
  4. jboss maven_使用Maven配置JBoss / Wildfly数据源
  5. 企业为什么要开通银企直联_企业为什么要做网站推广
  6. python是什么语言-python底层是什么语言
  7. 官网opencv练习题 最简单的多物体分离技术
  8. 批处理中%1~%9是什么意思?
  9. itil 容量管理流程_ITIL 4管理实践之服务管理实践概述
  10. 跟着团子学SAP—SAP LTMC基础教程(物料主数据导入示例)
  11. 11月14日Fluent建模笔记
  12. 2021“智荟杯”浦发百度高校极客挑战赛——比赛总结
  13. 借助JavaCV实现android手机查看PC摄像头实时视频
  14. unnormal C++
  15. AutoCAD Map 3D对ArcGIS shp文件的操作详解!
  16. html CSS笔记
  17. Linux FTDI
  18. OFDM调制matlab仿真详细代码
  19. 再谈SG函数和SG定理
  20. 局域网arp攻击_一篇文章告诉你,什么是ARP协议与ARP欺骗

热门文章

  1. MRI相关的基本概念
  2. 104-twinkstar-2021-05-17
  3. Unity中实现360°预览模型
  4. MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论
  5. 2.5年的IT老鸟,飞过后留下了啥?
  6. 1000道阿里巴巴初级~高级Java工程师面试题(含答案,软件架构师之路阅读
  7. 程序员必须掌握的15种框架,你能知道多少个?
  8. 用树莓派搭建全功能NAS服务器(04):打造个人网盘系统优化
  9. vector中定义二维数组
  10. 公司组建一支算法团队的隐性成本都有哪些?