Jvm常用启动参数整理

查看任何一个JVM(jvm)(Jvm)参数的默认值

java -XX:+PrintFlagsFinal -version |grep MetaspaceSize

下面的模板摘自线上核心业务系统的jvm启动模板

-XX:-UseBiasedLocking 
-XX:AutoBoxCacheMax=20000 
-Xloggc:/filepath/gc.log 
-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintGCDateStamps 
-XX:+PrintGCDetails 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath="/filepath/" 
-XX:ErrorFile="/filepath/hs_err_pid<pid>.log" 
-XX:+PrintCommandLineFlags 
-XX:-OmitStackTraceInFastThrow 
-XX:+UseConcMarkSweepGC 
-XX:CMSInitiatingOccupancyFraction=75 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:MaxTenuringThreshold=6 
-XX:+ExplicitGCInvokesConcurrent 
-XX:+ParallelRefProcEnabled 
-server 
-Xmx4g 
-Xms4g 
-XX:NewRatio=1 
-XX:MetaspaceSize=128m 
-XX:MaxMetaspaceSize=512m 

server or client

服务端的形式启动jvm,会有很多系统参数的优化相对于client客户端的模式。java -version可以查看当前默认是Server模式还是Client模式image.png

UseBiasedLocking

偏向锁开关,-代表关闭,+代表打开,线上目前是关闭状态

AutoBoxCacheMax

java的Integer对象中有一个IntegerCache缓存,IntegerCache有一个静态代码块,JVM在加载Integer这个类时,会优先加载静态的代码。当JVM进程启动完毕后, -128 ~ +127 范围的数字会被缓存起来,调用valueOf方法的时候,如果是这个范围内的数字,则直接从缓存取出。超过这个范围的则构造新的Integer对象。

loggc

指定gc日志文件

PrintGCApplicationStoppedTime

打印垃圾回收期间程序暂停的时间

PrintGCDateStamps

GC发生的时间信息

PrintGCDetails

打印GC详细信息

HeapDumpOnOutOfMemoryError

OutOfMemoryError发生时导出dump文件

HeapDumpPath

dump文件的目录

ErrorFile

错误文件,当java发生致命错误时,例如jdk的bug等。记录错误日志用于上报分析

PrintCommandLineFlags

可以让在程序运行前打印出用户手动设置或者JVM自动设置的XX参数的配置值

OmitStackTraceInFastThrow

省略异常栈信息从而快速抛出,默认为开启状态,如果开启该参数,JVM会对一些特定的异常类型做Fast Throw优化,如果检测到在代码里某个位置连续多次抛出同一类型异常的话(treat_throw_as_hot=true),则用Fast Throw方式来抛出异常,而异常Trace及详细的异常栈信息会被清空。这种异常抛出速度非常快,因为不需要在堆里分配内存,也不需要构造完整的异常栈信息
JVM只对几个特定类型异常开启了Fast Throw优化:

  • NullPointerException
  • ArithmeticException
  • ArrayIndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException

UseConcMarkSweepGC

老年代使用cms收集器

CMSInitiatingOccupancyFraction

CMS垃圾收集器,当老年代内存使用达到指定配置比例时,触发CMS垃圾回收

UseCMSInitiatingOccupancyOnly

指定HotSpot-VM总是使用-XX:CMSInitiatingOccupancyFraction的值作为old的空间使用率限制来启动CMS垃圾回收。如果没有使用-XX:+UseCMSInitiatingOccupancyOnly,那么HotSpot-VM只是利用这个值来启动第一次CMS垃圾回收,后面都是使用HotSpot-VM自动计算出来的值。

MaxTenuringThreshold

对象经历多少次Minor-GC才晋升到旧生代,默认值是15

ExplicitGCInvokesConcurrent

System.gc()是正常FULL GC,会STW,打开此参数后,在做System.gc()时会做background模式CMS GC,即并行FULL GC,可提高FULL GC效率
注,该参数在允许systemGC且使用CMS GC时有效

ParallelRefProcEnabled

采用多线程的方式发现需要处理的finalize方法的对象,非多线程执行对象的finalize方法;如果应用有大量的引用或者finalizable对象需要处理,指定下面这个选项可以减少垃圾回收的时间,他会使用多个的引用处理线程,而不是单个线程。这个选项不会启用多线程运行方法的finalizer。他会使用很多线程去发现需要排队通知的finalizable对象。

mx

java heap堆最大内存

ms

java heap堆初始化内存

NewRatio

新老代内存比,老年代:新生代,-XX:NewRatio=8 新老代内存比,老年代:新生代=8:1

官方文档:https://docs.oracle.com/cd/E19900-01/819-4742/abeik/index.html
The default NewRatio for the Server JVM is 2: the old generation occupies 2/3 of the heap while the new generation occupies 1/3.

SurvivorRatio

-XX:SurvivorRatio=8 新生代内存比,Eden园:survivor区=8:1,由于存活区survivor有两个,所以是2/10比例

MetaspaceSize

1.8之后不再有持久带概念,取而代之的为Metaspace,指定MetaspaceSize大小
Metaspace由于使用不断扩容到-XX:MetaspaceSize参数指定的量,就会发生FGC;且之后每次Metaspace扩容都可能会发生FGC

MaxMetaspaceSize

与上面配置对应的最大值,默认是一个极大的值,例如:18446744073709547520
如果MaxMetaspaceSize设置太小,可能会导致频繁FullGC,甚至OOM
查看默认配置:java -XX:+PrintFlagsFinal -version |grep MetaspaceSize

PrintSafepointStatistics

打印安全点统计的一些分析信息

PrintSafepointStatisticsCount

-XX:PrintSafepointStatisticsCount=1 打印安全点统计信息count值,与上面的PrintSafepointStatistics参数同时开启使用才会打印统计信息

ss

栈大小

NativeMemoryTracking

Native Memory Tracking(NMT)是Java7U40引入的HotSpot新特性,可用于监控JVM原生内存的使用,但比较可惜的是,目前的NMT不能监控到JVM之外或原生库分配的内存。java进程启动时指定开启NMT(有一定的性能损耗),输出级别可以设置为“summary”或“detail”级别。
开启后,通过jcmd可以访问收集到的数据

// 开启:-XX:NativeMemoryTracking=summary 或者 -XX:NativeMemoryTracking=detail
jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff 

UnlockDiagnosticVMOptions

Enable normal processing of flags

PrintNMTStatistics

Print native memory tracking summary data if it is on
-XX:+UnlockDiagnosticVMOptions必须配合参数{2}使用,并且只能加在其后才能生效
可以通过上面两个VM参数在JVM退出时打印NMT报告

<think>好的,我现在需要回答用户关于JVM常用知识点总结的问题。根据用户提供的引用内容,我需要整理JVM的主要知识点,包括类加载、内存结构、垃圾回收和调优等方面。同时,用户还要求生成相关问题,所以我要确保覆盖这些方面的内容,并基于引用中的信息进行回答。 首先,我需要回顾用户提供的四个引用内容。引用[1]提到运行时数据区域,即JVM的内存结构。引用[4]详细列出了类加载、内存结构、垃圾回收和调优的各个子项,这可以作为回答的主要结构。引用[2]和[3]则涉及垃圾回收器的参数设置和工具使用,这部分需要整合到垃圾回收和调优部分。 接下来,我需要按照引用[4]的结构来组织回答:类加载篇、JVM内存结构篇、垃圾回收篇、JVM调优篇。每个部分下再分小点,比如类加载过程、类加载器分类、双亲委派机制等。同时,要确保使用正确的中文表达,并遵循系统级指令中的格式要求,例如数学表达式用$...$,独立公式用$$...$$,但根据用户的问题,可能数学公式较少,更多是技术术语。 在引用其他内容时,需要自然地添加引用标识,比如在提到内存结构时引用[1],在讨论堆内存溢出自动dump时引用[2],在说明GC日志和工具时引用[3],在整体结构上引用[4]。 然后,生成相关问题需要考虑用户可能感兴趣的后续问题,比如类加载机制、双亲委派的好处、内存结构各部分的作用、垃圾回收算法比较、调优工具使用等。需要确保问题覆盖用户可能想深入了解的方面,并基于已有的引用内容,避免超出范围。 最后,检查是否符合所有系统级指令:行内数学表达式是否正确(虽然这里可能用不上),独立公式是否单独成段(可能同样不适用),LaTeX语法正确,使用中文回答,生成相关问题,并在引用处标注标识符。同时,用户可见层要求结构清晰,帮助用户逐步解决问题,回答真实可靠。 总结步骤: 1. 按照引用[4]的结构组织内容,分为四个主要部分。 2. 每个部分下详细列出子项,结合其他引用的具体信息。 3. 在适当的位置添加引用标识,如内存结构引用[1],调优参数引用[2][3]。 4. 生成相关问题,覆盖各个主要部分的关键点。 5. 确保回答符合格式要求,无Markdown,使用中文,结构清晰。 现在开始撰写正式回答,确保每个部分简明扼要,信息准确,引用正确。</think>### JVM 常用知识点总结 #### 一、类加载篇 1. **类加载过程** 类加载分为 **加载、验证、准备、解析、初始化** 五个阶段。 - **加载**:通过类名获取二进制字节流,生成类的Class对象。 - **验证**:确保字节码符合JVM规范,例如文件格式、元数据、字节码验证[^4]。 - **准备**:为类变量分配内存并设置初始值(零值)。 - **解析**:将符号引用转换为直接引用。 - **初始化**:执行类构造器`<clinit>()`方法,完成静态变量赋值和静态代码块执行。 2. **类加载器分类** - **启动类加载器(Bootstrap ClassLoader)**:加载`JRE/lib`下的核心类库(如`rt.jar`)。 - **扩展类加载器(Extension ClassLoader)**:加载`JRE/lib/ext`目录的类。 - **应用程序类加载器(Application ClassLoader)**:加载用户类路径(ClassPath)的类。 - **自定义类加载器**:用户可通过继承`ClassLoader`实现自定义加载逻辑[^4]。 3. **双亲委派机制** 类加载时优先委派给父类加载器,若父类无法加载,子类才尝试加载。 **优点**:避免重复加载,保证核心类库的安全性。 --- #### 二、JVM内存结构篇 1. **JVM内存结构** JVM内存分为以下区域: - **堆(Heap)**:存储对象实例,是垃圾回收的主要区域[^1]。 - **方法区(Method Area)**:存储类信息、常量、静态变量。 - **虚拟机栈(VM Stack)**:存储方法调用的栈帧(局部变量表、操作数栈等)。 - **本地方法栈(Native Method Stack)**:为Native方法服务。 - **程序计数器(PC Register)**:记录当前线程执行的位置。 2. **对象的创建过程** 1. 类加载检查 → 2. 分配内存(指针碰撞或空闲列表) → 3. 初始化零值 → 4. 设置对象头 → 5. 执行`<init>`方法。 3. **强软弱虚引用** - **强引用**:对象存活时不会被回收。 - **软引用**:内存不足时可能被回收。 - **弱引用**:垃圾回收时立即被回收。 - **虚引用**:用于跟踪对象被回收的状态。 --- #### 三、垃圾回收篇 1. **如何判断对象是否死亡** - **可达性分析**:从GC Roots出发,不可达的对象标记为可回收。 - **引用计数法**(较少使用):循环引用可能导致内存泄漏。 2. **垃圾回收算法** - **标记-清除**:产生内存碎片。 - **复制算法**:适用于新生代(如Survivor区)。 - **标记-整理**:适用于老年代。 - **分代收集**:结合新生代(Minor GC)和老年代(Full GC)特性优化。 3. **常见垃圾收集器** - **Serial/Serial Old**:单线程,适合客户端应用。 - **ParNew**:多线程版Serial。 - **CMS(Concurrent Mark Sweep)**:以最短停顿时间为目标,但会产生内存碎片。 - **G1(Garbage-First)**:分Region回收,兼顾吞吐量和低延迟。 --- #### 四、JVM调优篇 1. **调优时机** - 频繁Full GC或长时间GC停顿。 - 堆内存溢出(可通过`-XX:+HeapDumpOnOutOfMemoryError`生成dump文件分析[^2])。 2. **监控与诊断工具** - **jps**:查看Java进程ID[^3]。 - **jstat**:监控GC状态(如`jstat -gc <pid>`)。 - **jstack**:生成线程快照,排查死锁。 - **jmap**:分析堆内存对象分布(如`jmap -histo <pid>`)。 3. **常用调优参数** - 堆大小:`-Xms`(初始堆)、`-Xmx`(最大堆)。 - 新生代比例:`-XX:NewRatio`。 - GC日志:`-XX:+PrintGCDetails -XX:+PrintGCTimeStamps`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值