Java常用JVM参数实战
作者:蚂蚁背大象 发布时间:2023-03-15 10:33:39
在Java应用程序的部署和调优过程中,合理配置JVM参数是提升性能和稳定性的关键之一。本文将介绍一些常用的JVM参数,并给出具体的使用例子和作用的分析。
内存管理相关参数
-Xmx和-Xms
-Xmx参数用于设置JVM的最大堆内存大小,而-Xms参数用于设置JVM的初始堆内存大小。这两个参数可以在启动时通过命令行进行配置,例如:
java -Xmx2g -Xms512m MyApp
上述示例将JVM的最大堆内存设置为2GB,初始堆内存设置为512MB。
作用分析:
较大的最大堆内存可以增加应用程序的可用内存空间,提高性能。但也需要考虑服务器硬件资源的限制。
合理设置初始堆内存大小可以减少JVM的自动扩容和收缩开销。
-XX:NewRatio和-XX:SurvivorRatio
-XX:NewRatio参数用于设置新生代与老年代的比例,默认值为2。而-XX:SurvivorRatio参数用于设置Eden区与Survivor区的比例,默认值为8。
例如,我们可以使用以下参数配置:
java -XX:NewRatio=3 -XX:SurvivorRatio=4 MyApp
作用分析:
调整新生代与老年代的比例可以根据应用程序的特点来优化内存分配。
调整Eden区与Survivor区的比例可以控制对象在新生代中的存活时间。
-XX:MaxMetaspaceSize
在Java 8及之后的版本中,-XX:MaxMetaspaceSize参数用于设置元空间(Metaspace)的最大大小。例如:
java -XX:MaxMetaspaceSize=512m MyApp
作用分析:
元空间用于存储类的元数据信息,包括类的结构、方法、字段等。
调整元空间的最大大小可以避免元空间溢出的问题,提高应用程序的稳定性。
-Xmn
-Xmn参数用于设置新生代的大小。以下是一个例子:
java -Xmn256m MyApp
-Xmn256m将新生代的大小设置为256MB。
作用分析:
新生代主要存放新创建的对象,设置合适的大小可以提高垃圾回收的效率。
垃圾回收相关参数
-XX:+UseG1GC
-XX:+UseG1GC参数用于启用G1垃圾回收器。例如:
java -XX:+UseG1GC MyApp
作用分析:
G1垃圾回收器是Java 9及之后版本的默认垃圾回收器,具有更好的垃圾回收性能和可预测的暂停时间。
使用G1垃圾回收器可以减少垃圾回收的停顿时间,提高应用程序的吞吐量。
-XX:ParallelGCThreads和-XX:ConcGCThreads
-XX:ParallelGCThreads参数用于设置并行垃圾回收器的线程数量,而-XX:ConcGCThreads参数用于设置并发垃圾回收器的线程数量。例如:
java -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 MyApp
作用分析:
并行垃圾回收器通过使用多个线程来并行执行垃圾回收操作,提高回收效率。
并发垃圾回收器在应用程序运行的同时执行垃圾回收操作,减少停顿时间。
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExplicitGCInvokesConcurrent参数用于允许主动触发并发垃圾回收。例如:
java -XX:+ExplicitGCInvokesConcurrent MyApp
作用分析:
默认情况下,当调用System.gc()方法时,JVM会使用串行垃圾回收器执行垃圾回收操作。使用该参数可以改为使用并发垃圾回收器执行垃圾回收操作,减少停顿时间。
性能监控和调优参数
-XX:+PrintGCDetails和-XX:+PrintGCDateStamps
-XX:+PrintGCDetails参数用于打印详细的垃圾回收信息,-XX:+PrintGCDateStamps参数用于打印垃圾回收发生的时间戳。例如:
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps MyApp
作用分析:
打印垃圾回收的详细信息可以帮助我们了解垃圾回收器的工作情况,检测潜在的性能问题。
打印垃圾回收发生的时间戳可以帮助我们分析应用程序的垃圾回收模式和频率。
-XX:+HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath
-XX:+HeapDumpOnOutOfMemoryError参数用于在发生内存溢出错误时生成堆转储文件,-XX:HeapDumpPath参数用于指定堆转储文件的路径。例如:
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump/file MyApp
作用分析:
在发生内存溢出错误时生成堆转储文件可以帮助我们分析应用程序的内存使用情况,定位内存泄漏和性能瓶颈。
-XX:ThreadStackSize
-XX:ThreadStackSize参数用于设置线程栈的大小。以下是一个例子:
java -XX:ThreadStackSize=256k MyApp
作用分析:
线程栈用于存储线程执行时的方法调用和局部变量等信息。
通过调整线程栈的大小,可以控制应用程序中线程的数量和资源消耗。
-XX:MaxDirectMemorySize
-XX:MaxDirectMemorySize参数用于设置直接内存的最大大小。以下是一个例子:
java -XX:MaxDirectMemorySize=1g MyApp
作用分析:
直接内存是Java堆外的内存,由ByteBuffer等类使用。
合理设置直接内存的最大大小可以避免直接内存溢出的问题,提高应用程序的稳定性。
其他参数
除了上述介绍的常用JVM参数,还有一些其他参数可以根据具体需求进行配置,如:
-XX:+DisableExplicitGC:禁止主动调用System.gc()方法。
-XX:+UseCompressedOops:启用指针压缩以减小对象引用的内存占用。
-XX:OnOutOfMemoryError:在发生OutOfMemoryError时执行特定的命令或脚本。
这些参数可以根据应用程序的特点和需求进行调优和配置,以提升应用程序的性能和稳定性。
来源:https://juejin.cn/post/7235435351049781304
猜你喜欢
- 详解java.lang.reflect.Modifier.isInterface()方法java.lang.reflect.Modifier
- 注意是maven的webapp:选择maven下一步下一步。maven下载过慢在setting中加入镜像。 我也有疑问这是什么鬼格式,但是证
- 今天碰到个很恶心的东西。。就是明明导入了相应的依赖文件(css,html,js等文件),路径也正确。。就是访问不了。。。。弄了一个多小时。。
- 最近做了关于在Android设备上外接扫码的项目,在此记录一下关于Android USB扫码枪获取内容的问题首先我这边使用是USB HID的
- 前言这篇文章主要给大家介绍了关于C#导出pdf的实现方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧方法如下:一.接口部
- java线程同步原理java会为每个object对象分配一个monitor,当某个对象的同步方法(synchronizedmethods)被
- java 根据经纬度获取地址实现代码实现代码:public class GetLocation { public
- 本文实例为大家分享了java实现简易的学籍管理系统的具体代码,供大家参考,具体内容如下一、 代码import java.awt.*;impo
- 如何在Unity里修改FBX模型自带的动画我们在把模型做成预制体的时候会出现,模型当前看到的位置和动画播放的位置不一致,而且模型动画文件又是
- 本文实例为大家分享了Android简单的自定义标题栏,供大家参考,具体内容如下android自定义控件向来都是开发者最头疼的,但是我们要有那
- Redisson分布式锁之前的基于注解的锁有一种锁是基本redis的分布式锁,锁的实现我是基于redisson组件提供的RLock,这篇来看
- 为什么需要 StreamStream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 Output
- ObjectMapper 忽略字段大小写核心代码:ObjectMapper mapper = new ObjectMapper();mapp
- CXF简介CXF是一个开源的WebService框架。Apache CXF = Celtix + XFire,开始叫 Apache Celt
- 有时候在单机部署,或者项目没有在IDea 开发工具中运行(idea可以自动打开tomcat项目),需要项目启动后自动打开浏览器访问项目,配置
- 前言面对众多卡片层叠效果,我们的产品童鞋也突发奇想,搞出了另一种卡片层叠切换展示的交互,而且产品狗们居然要求多做几种动效给他们看,好让他们选
- 栈和队列的本质是相同的,都只能在线性表的一端进行插入和删除。因此,栈和队列可以相互转换。用栈实现队列—力扣232题题目要求:仅使用两个栈实现
- 上一篇说的CountDownLatch是一个计数器,类似线程的join方法,但是有一个缺陷,就是当计数器的值到达0之后,再调用CountDo
- 如下所示:public class 字符串常用操作 { public static void main(String[] arg
- 最近项目需要通过经纬度查询 具体的地址和区域名称,通过查询网络资源,发现提供的大多是得到具体的地址而对区域或城市名称的获取就不是很好把握;在