被虐后,分享JVM调优原理相关的知识和经验

被虐后,分享JVM调优原理相关的知识和经验

作者: Java编程技术乐园 2021-05-12 13:40:16

云计算

虚拟化 一定要记住的是任何的调优都不是一蹴而就,不要指望改动一个参数就达到调优的目的,也不要仅仅改动了一个参数,就认为是做了调优。调优是在已有的资源和要达到的目标的前提上,进行权衡。

[[399065]]

本文只介绍一些原理和思路的内容,希望对你与所帮助!

先了解原理,然后在进行调优。

一定要记住的是任何的调优都不是一蹴而就,不要指望改动一个参数就达到调优的目的,也不要仅仅改动了一个参数,就认为是做了调优。调优是在已有的资源和要达到的目标的前提上,进行权衡。

从类加载到整个JVM的运行周期内大致流程和结构如下:

从上图可以看到,JVM 可以划分为这些部分:

执行引擎,包括:GC、JIT 编译器

类加载子系统,这部分的问题,一般在开发过程中出现

JNI 部分,这部分问题一般在 JVM 之外

运行时数据区;Java 将内存分为 2 大块:堆内存和栈内存

首先我们要对上述的内容有一定的了解,从全局出发。看了上图,在调优中我们能做的也就是对运行时数据区进行一些操作,然后选择执行引擎用何种垃圾收集器对垃圾进行回收。

1、本文调优思路只针对JVM1.8,先看下JVM1.8内存模型

注意:JVM 线程占用的是系统空间,所以当JVM的堆内存越大,系统本身的内存就越少,自然可生成的线程数量就越少。

2、JVM调优,主要从两个方面考虑:堆内存大小配置和垃圾回收算法选择

  1. # 设置堆内存 
  2. -Xmx4g -Xms4g  
  3. # 指定 GC 算法 
  4. -XX:+UseG1GC -XX:MaxGCPauseMillis=50  
  5. # 指定 GC 并行线程数 
  6. -XX:ParallelGCThreads=4  
  7. # 打印 GC 日志 
  8. -XX:+PrintGCDetails -XX:+PrintGCDateStamps  
  9. # 指定 GC 日志文件 
  10. -Xloggc:gc.log  
  11. # 指定 Meta 区的最大值 
  12. -XX:MaxMetaspaceSize=2g  
  13. # 设置单个线程栈的大小 
  14. -Xss1m  
  15. # 指定堆内存溢出时自动进行 Dump 
  16. -XX:+HeapDumpOnOutOfMemoryError  
  17. -XX:HeapDumpPath=/usr/local 

3、JVM – GC类型组合以及适用场合

垃圾回收,分为Young区垃圾回收器,以及Old区垃圾回收器两部分,两部分需要组合使用:

新生代收集器:Serial、ParNew、Parallel Scavenge;

老年代收集器:Serial Old、Parallel Old、CMS;

serial:新生代收集器,是最早出现最成熟的收集器,单线程,独占式,GC时会stop the world 应用暂停。

ParNew :新生代收集器,是Serial 收集器的多线程版本,独占式,同样地GC时会stop the world 应用暂停。

Parallel Scavenge:新生代收集器, 独占式, 与ParNew相似,特点:吞吐量优先

CMS:(concurrent-mark-sweep),老年代收集器,非独占式,多个线程,标记并清除算法,响应时间优先,缺点是GC后不进行内存整理,会有内存碎片。

Serial Old:是Serial 的老年代版本,同样是单线程收集器, 独占式

Parallel Old 是Parallel Scavenge 收集器的老年代版本,多线程收集, 独占式

G1:备受期待的新一代垃圾收集器,可预测的停顿:这又是G1相对于CMS的一大优势,结合了Parallel Scavenge以及CMS两种收集器的优点,又摒弃了其缺陷, 非独占式

收集器的好坏,主要有两个指标:停顿时间和吞吐量

GC 选择的经验总结

综合来看,G1 是 JDK11 之前 HotSpot JVM 中最先进的准产品级(production-ready) 垃圾收集器。重要的是,HotSpot 工程师的主要精力都放在不断改进 G1 上面。在更新的 JDK 版本中,将会带来更多强大的功能和优化。

可以看到,G1 作为 CMS 的代替者出现,解决了 CMS 中的各种疑难问题,包括暂停时间的可预测性,并终结了堆内存的碎片化。对单业务延迟非常敏感的系统来说,如果 CPU 资源不受限制,那么 G1 可以说是 HotSpot 中最好的选择,特别是在最新版本的 JVM 中。当然这种降低延迟的优化也不是没有代价的:由于额外的写屏障和守护线程,G1 的开销会更大。如果系统属于吞吐量优先型的,又或者 CPU 持续占用 100%,而又不在乎单次 GC 的暂停时间,那么 CMS 是更好的选择。

总之,G1 适合大内存,需要较低延迟的场景。

选择正确的 GC 算法,唯一可行的方式就是去尝试,并找出不合理的地方,一般性的指导原则:

  • 如果系统考虑吞吐优先,CPU 资源都用来最大程度处理业务,用 Parallel GC;
  • 如果系统考虑低延迟有限,每次 GC 时间尽量短,用 CMS GC;
  • 如果系统内存堆较大,同时希望整体来看平均 GC 时间可控,使用 G1 GC。

对于内存大小的考量:

  • 一般 4G 以上,算是比较大,用 G1 的性价比较高。
  • 一般超过 8G,比如 16G-64G 内存,非常推荐使用 G1 GC。

最后讨论一个很多开发者经常忽视的问题,也是面试大厂常问的问题:

JDK 8 的默认 GC 是什么?

很多人或觉得是 CMS,甚至 G1,其实都不是。

答案是:JDK 8并行 GC 是 JDK8 里的默认 GC 策略。默认使用的是 Parallel Scavenge (新生代) 和 Parallel Old (老年代),基于我的Jdk 1.8.0_181-b13版本

注意,G1 成为 JDK9 以后版本的默认 GC 策略,同时,ParNew + SerialOld 这种组合不被支持。

 

最后在分享一下,调优后如果还遇到JVM相关问题,请记住十六字箴言:做好监控,定位问题,验证结果,总结归纳。

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/261372.html<

(0)
管理的头像管理
上一篇2025-05-03 14:50
下一篇 2025-05-03 14:52

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注