JVM参数
- -Xms: 指定堆的初始值
- -Xmx: 指定堆的最大值
- -Xss: 指定线程栈的大小。默认值为1MB
- -Xmn: 指定年轻代的大小
- -Xnoclassgc: 禁止对类的垃圾回收
- -XX:PermSize=: 指定永久代的初始值(在Java 8以后被废弃)
- -XX:MaxPermSize=: 指定永久代的最大值(在Java 8以后被废弃)
- -XX:MaxMetaspaceSize=: 指定元空间的最大值(Java 8以后的代替形式)
- -XX:MetaspaceSize=: 指定元空间的初始值(Java 8以后的代替形式)
- -XX:SurvivorRatio=: 指定新生代中eden区和survivor区的大小比例
- -XX:MaxTenuringThreshold=: 指定对象晋升到老年代的年龄阈值
- -XX:+DisableExplicitGC: 禁用对System.gc()方法的响应
- -XX:+UseG1GC: 启用G1垃圾收集器
- -XX:+UseConcMarkSweepGC: 启用CMS垃圾收集器
- -XX:ParallelGCThreads=: 指定并行垃圾收集器的线程数
- -XX:ConcGCThreads=: 指定CMS垃圾收集器的并发线程数
- -XX:CompileThreshold=: 指定方法被调用多少次之后才进行编译
- -XX:+HeapDumpOnOutOfMemoryError: 在出现内存溢出错误时,自动生成堆转储文件
- -XX:HeapDumpPath=
: 指定堆转储文件的输出路径 - -XX:+PrintGC: 打印GC的详细信息
- -XX:+PrintGCDetails: 打印GC的详细信息,包括GC前后的堆大小、GC耗时等信息
- -XX:+PrintGCDateStamps: 带时间戳输出GC信息
- -XX:+PrintGCTimeStamps: 带时间戳输出GC耗时
- -XX:+PrintHeapAtGC: 在每次GC之后打印堆的信息
- -XX:+PrintClassHistogram: 打印当前JVM中的类信息
- -XX:PrintCommandLineFlags: 打印JVM启动时使用的参数列表
- -XX:+TraceClassLoading: 显示类加载信息
- -XX:+TraceClassUnloading: 显示类卸载信息
- -XX:+TraceClassResolution: 显示类解析信息
- -XX:+PrintCompilation: 在每次JIT编译时输出编译详情
- -XX:+PrintInlining: 在每次JIT编译时输出内联信息
- -XX:+PrintAssembly: 在每次JIT编译时输出汇编代码
注意事项:JVM的完整参数列表取决于你所使用的JVM版本和具体实现。不同的JVM实现可能会有一些特定的参数,因此建议查阅对应版本的JVM文档。一些常用的参数可以通过命令行传入,例如java -Xmx2048m -Xms1024m -jar app.jar等,也可以通过JAVA_TOOL_OPTIONS环境变量指定。、
JVM调优经历记录
- 元空间内存泄漏
while (true) {
SerializeConfig config = new SerializeConfig();
config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
String s = JSON.toJSONString(test5, config);
}
其中,SerializeConfig是fastjson中的类
上述代码频繁调用会创建代理对象,导致元空间被打满,最后触发FullGC;
Java元空间(Metaspace)是Java 8以后代替永久代(PermGen)的一种新的内存区域。Java元空间使用的是本地内存而不是JVM内部的堆内存,因此它的垃圾回收与堆内存的垃圾回收方式不同。
Java元空间是基于操作系统的虚拟地址空间进行管理的。如果元空间中的类或符号表达到了操作系统默认的最大虚拟内存限制,将会触发Full GC。这个上限参数可通过-XX:MaxMetaspaceSize进行设置,默认值为UNLIMITED,意味着Java虚拟机将会使用系统的最大容量作为元空间的上限。除非应用程序大量使用反射、动态生成类等高程度使用Java元空间的行为,否则默认配置下,元空间不太可能出现Full GC。如果发生Full GC,一般建议增加元空间的最大容量设置。