大家好,我是程序员牛肉。
今天在刷牛客的时候看到了一个面试题,题目是关于Java虚拟机(JVM)配置参数的。
这个问题大家能答上来嘛?不会张口就是“设置堆空间大小”吧。
这样回答就太没有意思了,也没办法引起面试官的兴趣。因此我们今天来给大家分享几个大厂常用的JVM配置参数。正所谓我学过就是我干过,看完这篇文章以后大家也就是参加过配置大厂JVM参数配置的人了。
第一个:
-XX:-UseBiasedLocking
该指令的作用是关闭偏向锁,对于不懂的朋友我们先来介绍一下什么是偏向锁:
[偏向锁是一种锁优化机制,其核心思想是锁会偏向于第一个获取它的线程。如果该线程再次进入同步块,锁不会进行竞争,直接获取锁]
这种优化机制听起来不错,但在线上的高并发的系统中,一般都要关闭掉偏向锁,因为线程间存在锁竞争,锁撤销会消耗大量的资源。
偏向锁的撤销需要等待全局安全点(safe point),暂停持有偏向锁的线程,检查持有偏向锁的线程状态。首先遍历当前JVM的所有线程,如果能找到偏向线程,则说明偏向的线程还存活,此时检查线程是否在执行同步代码块中的代码,如果是,则升级为轻量级锁,进行CAS竞争锁。
也就是说:线上高并发环境下,偏向锁的频繁撤销和创建会导致频繁的STW,导致线上服务停顿时间过长。
第二个:
-XX:+HeapDumpOnOutOfMemoryError
该指令的作用是在OOM之前生成堆转储,有助于分析内存问题。先说说什么是堆转储吧:
[堆转储(Heap Dump)是Java虚拟机(JVM)中的一种调试工具,用于捕获应用程序在某一时刻的内存快照。堆转储文件包含了JVM堆内存中所有对象的详细信息,包括对象的类型、大小、字段值以及对象之间的引用关系。]
这个指令会将线上服务发生OOM时的内存快照截取下来,方便我们后续基于这个快照文件来排查代码问题。
其实线上排查OOM就是这个思路:
先配置这个参数将使得OOM的时候会保存对应的内存快照,我们通过跳板机来从线上服务器中拉取对应的堆转储文件,之后在本地使用类似于 Eclipse Memory Analyzer 这种分析工具来对堆内存进行分析即可。
并且我们还需要结合下面这个指令来实现:
-XX:HeapDumpPath=
这个指令的作用是指定堆转储文件的存放地址。方便我们后续基于跳板机进行拉取。
第三个:
-XX:+UseG1GC
这个指令的作用是使用G1垃圾回收器。我们先来介绍一下什么是G1垃圾回收器:
G1 是一种面向服务器端应用的垃圾收集器,专为多核处理器和大内存机器设计。它的主要目标是在满足高吞吐量的同时,尽可能缩短垃圾收集(GC)造成的停顿时间。G1 收集器在 JDK 7中被正式推出,并在 JDK 9 中成为默认的垃圾收集器。
而很多线上服务的JDK版本是1.8,因此需要手动的开启这个指令来使用G1垃圾回收器。
而说到GC垃圾回收,我们在线上还需要配置以下参数:
-XX:NumberOfGCLogFiles=xx
这个指令的作用是在记录GC日志文件的时候,设置最大的GC日志文件个数。
-XX:+UseGCLogFileRotation
这个指令的作用是开启日志轮转功能。
而这两个指令一般结合使用,这样的话GC日志在记录到最大的文件数量上限的时候,就会开始进行覆写操作,覆盖掉之前旧的GC文件。
基于这种方式我们就实现了限制日志文件的大小,防止其无限增长挤压磁盘空间,并且也有利于日志的管理和分析。
但是他也有一定的缺点:在应用重启时新旧日志内容可能会混合,这就需要在重启应用前将旧的GC日志移动到不同的文件夹中。
那今天关于JVM常见的配置参数就介绍到这里了。相信通过我的介绍,你已经大致了解了一些JVM的配置参数。希望我的文章可以帮到你。