一马平川
不积跬步无以至千里,后继才能薄发

JVM基本调优参数

2021年06月15日
0
未分类

指定堆大小

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
1
2
3
4
5
<span class="line"><span class="comment">//指定堆最大</span></span><br><span class="line">-XX:Xmx1024m</span><br><span class="line"></span><br><span class="line"><span class="comment">//指定堆初始大小</span></span><br><span class="line">-XX:Xms1024m</span><br>
<span class="line"><span class="comment">//指定堆最大</span></span><br><span class="line">-XX:Xmx1024m</span><br><span class="line"></span><br><span class="line"><span class="comment">//指定堆初始大小</span></span><br><span class="line">-XX:Xms1024m</span><br>
//指定堆最大
-XX:Xmx1024m

//指定堆初始大小
-XX:Xms1024m

Java方法栈

指定线程的栈最大空间

<span class="line">1</span><br><span class="line">2</span><br>
<span class="line">1</span><br><span class="line">2</span><br>
1
2
<span class="line"><span class="comment">//默认256K</span></span><br><span class="line">-XX:Xss128K</span><br>
<span class="line"><span class="comment">//默认256K</span></span><br><span class="line">-XX:Xss128K</span><br>
//默认256K
-XX:Xss128K

影响GC因素:

局部变量表槽位复用

在方法体中声明的变量都会在局部变量表中,如果超过其作用域,则会被之后声明的变量复用,如果是引用类型,则会失去引用,被GC。但如果只是超过作用域但是没有被其他变量复用,则不会失去引用。

栈内分配

逃逸分析

用于分析引用类型声明的变量的作用域是否会逃逸出方法体,如果作用域只在方法体内且不返回,则可以标量替换

标量替换

指类引用类型声明时,如果可以被

TLAB

TLAB(Thread Local Allocation Buffer)本地线程分配缓存,在类加载之后分配内存时,如果开启了这个选项,则可以在堆中属于线程的缓存区分配内存,不需要到共享的堆区进行内存申请,避免内存申请失败。开启了这个会使得栈内分配失效

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
1
2
3
4
5
<span class="line"><span class="comment">//开启TLAB</span></span><br><span class="line">-XX:+UseTLAB</span><br><span class="line"></span><br><span class="line"><span class="comment">//关闭</span></span><br><span class="line">-XX:-UseTLAB</span><br>
<span class="line"><span class="comment">//开启TLAB</span></span><br><span class="line">-XX:+UseTLAB</span><br><span class="line"></span><br><span class="line"><span class="comment">//关闭</span></span><br><span class="line">-XX:-UseTLAB</span><br>
//开启TLAB
-XX:+UseTLAB

//关闭
-XX:-UseTLAB

永久代&元空间

永久代

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br>
1
2
3
4
<span class="line"><span class="comment">//指定永久代初始大小</span></span><br><span class="line">-XX:PermSize64m</span><br><span class="line"><span class="comment">//指定最大永久代大小</span></span><br><span class="line">-XX:MaxPermSize128m</span><br>
<span class="line"><span class="comment">//指定永久代初始大小</span></span><br><span class="line">-XX:PermSize64m</span><br><span class="line"><span class="comment">//指定最大永久代大小</span></span><br><span class="line">-XX:MaxPermSize128m</span><br>
//指定永久代初始大小
-XX:PermSize64m
//指定最大永久代大小
-XX:MaxPermSize128m

元空间

元空间使用的是直接内存

<span class="line">1</span><br><span class="line">2</span><br>
<span class="line">1</span><br><span class="line">2</span><br>
1
2
<span class="line"><span class="comment">//指定元空间最大大小,默认无限制直到用光系统内存</span></span><br><span class="line">-XX:MaxMetaspaceSize512m</span><br>
<span class="line"><span class="comment">//指定元空间最大大小,默认无限制直到用光系统内存</span></span><br><span class="line">-XX:MaxMetaspaceSize512m</span><br>
//指定元空间最大大小,默认无限制直到用光系统内存
-XX:MaxMetaspaceSize512m

打印GC日志

jdk9之前

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br>
1
2
3
4
5
6
7
8
<span class="line"><span class="comment">//打印简单GC日志</span></span><br><span class="line">-XX:+PrintGC</span><br><span class="line"></span><br><span class="line"><span class="comment">//打印GC日志详情</span></span><br><span class="line">-XX:+PrintGCDetails</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取堆信息</span></span><br><span class="line">-XX:+PrintHeadAtGC</span><br>
<span class="line"><span class="comment">//打印简单GC日志</span></span><br><span class="line">-XX:+PrintGC</span><br><span class="line"></span><br><span class="line"><span class="comment">//打印GC日志详情</span></span><br><span class="line">-XX:+PrintGCDetails</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取堆信息</span></span><br><span class="line">-XX:+PrintHeadAtGC</span><br>
//打印简单GC日志
-XX:+PrintGC

//打印GC日志详情
-XX:+PrintGCDetails

//获取堆信息
-XX:+PrintHeadAtGC

jdk9、jdk10

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
1
2
3
4
5
<span class="line"><span class="comment">//打印简单日志</span></span><br><span class="line">-Xlog:gc</span><br><span class="line"></span><br><span class="line"><span class="comment">//打印日志详情</span></span><br><span class="line">-Xlog:gc*</span><br>
<span class="line"><span class="comment">//打印简单日志</span></span><br><span class="line">-Xlog:gc</span><br><span class="line"></span><br><span class="line"><span class="comment">//打印日志详情</span></span><br><span class="line">-Xlog:gc*</span><br>
//打印简单日志
-Xlog:gc

//打印日志详情
-Xlog:gc*

GC日志查看

注意:因为GC日志输出时机的原因,显示的数据可能并不准确,有问题的地方需要重新校对

DefNew
DefNew :新生代

eden
eden
from
from
to
to

Tenured
Tenured :老年代

Perm
Perm :永久代

类加载/卸载追踪

jdk9之前

<span class="line">1</span><br>
<span class="line">1</span><br>
1
<span class="line">-XX:+TraceClassLoading</span><br>
<span class="line">-XX:+TraceClassLoading</span><br>
-XX:+TraceClassLoading

jdk9、jdk10

<span class="line">1</span><br>
<span class="line">1</span><br>
1
<span class="line">-Xlog:<span class="class"><span class="keyword">class</span>+<span class="title">load</span></span>=info</span><br>
<span class="line">-Xlog:<span class="class"><span class="keyword">class</span>+<span class="title">load</span></span>=info</span><br>
-Xlog:class+load=info

柱状图分析

<span class="line">1</span><br><span class="line">2</span><br>
<span class="line">1</span><br><span class="line">2</span><br>
1
2
<span class="line"><span class="comment">//配合在控制台使用ctrl+Break展示信息</span></span><br><span class="line">-XX:+PrintClassHistogram</span><br>
<span class="line"><span class="comment">//配合在控制台使用ctrl+Break展示信息</span></span><br><span class="line">-XX:+PrintClassHistogram</span><br>
//配合在控制台使用ctrl+Break展示信息
-XX:+PrintClassHistogram

查看系统参数

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
1
2
3
4
5
<span class="line"><span class="comment">//程序运行时展示手动配置的参数</span></span><br><span class="line">-XX:+PrintVMOptions</span><br><span class="line"></span><br><span class="line"><span class="comment">//自动配置&手动配置的参数都展示</span></span><br><span class="line">-XX:+PrintCommandLineFlags</span><br>
<span class="line"><span class="comment">//程序运行时展示手动配置的参数</span></span><br><span class="line">-XX:+PrintVMOptions</span><br><span class="line"></span><br><span class="line"><span class="comment">//自动配置&手动配置的参数都展示</span></span><br><span class="line">-XX:+PrintCommandLineFlags</span><br>
//程序运行时展示手动配置的参数
-XX:+PrintVMOptions

//自动配置&手动配置的参数都展示
-XX:+PrintCommandLineFlags

指定堆大小

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
1
2
3
4
5
<span class="line"><span class="comment">//指定堆最大</span></span><br><span class="line">-XX:Xmx1024m</span><br><span class="line"></span><br><span class="line"><span class="comment">//指定堆初始大小</span></span><br><span class="line">-XX:Xms1024m</span><br>
<span class="line"><span class="comment">//指定堆最大</span></span><br><span class="line">-XX:Xmx1024m</span><br><span class="line"></span><br><span class="line"><span class="comment">//指定堆初始大小</span></span><br><span class="line">-XX:Xms1024m</span><br>
//指定堆最大
-XX:Xmx1024m

//指定堆初始大小
-XX:Xms1024m

Java方法栈

指定线程的栈最大空间

<span class="line">1</span><br><span class="line">2</span><br>
<span class="line">1</span><br><span class="line">2</span><br>
1
2
<span class="line"><span class="comment">//默认256K</span></span><br><span class="line">-XX:Xss128K</span><br>
<span class="line"><span class="comment">//默认256K</span></span><br><span class="line">-XX:Xss128K</span><br>
//默认256K
-XX:Xss128K

影响GC因素:

局部变量表槽位复用

在方法体中声明的变量都会在局部变量表中,如果超过其作用域,则会被之后声明的变量复用,如果是引用类型,则会失去引用,被GC。但如果只是超过作用域但是没有被其他变量复用,则不会失去引用。

栈内分配

逃逸分析

用于分析引用类型声明的变量的作用域是否会逃逸出方法体,如果作用域只在方法体内且不返回,则可以标量替换

标量替换

指类引用类型声明时,如果可以被

TLAB

TLAB(Thread Local Allocation Buffer)本地线程分配缓存,在类加载之后分配内存时,如果开启了这个选项,则可以在堆中属于线程的缓存区分配内存,不需要到共享的堆区进行内存申请,避免内存申请失败。开启了这个会使得栈内分配失效

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
1
2
3
4
5
<span class="line"><span class="comment">//开启TLAB</span></span><br><span class="line">-XX:+UseTLAB</span><br><span class="line"></span><br><span class="line"><span class="comment">//关闭</span></span><br><span class="line">-XX:-UseTLAB</span><br>
<span class="line"><span class="comment">//开启TLAB</span></span><br><span class="line">-XX:+UseTLAB</span><br><span class="line"></span><br><span class="line"><span class="comment">//关闭</span></span><br><span class="line">-XX:-UseTLAB</span><br>
//开启TLAB
-XX:+UseTLAB

//关闭
-XX:-UseTLAB

永久代&元空间

永久代

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br>
1
2
3
4
<span class="line"><span class="comment">//指定永久代初始大小</span></span><br><span class="line">-XX:PermSize64m</span><br><span class="line"><span class="comment">//指定最大永久代大小</span></span><br><span class="line">-XX:MaxPermSize128m</span><br>
<span class="line"><span class="comment">//指定永久代初始大小</span></span><br><span class="line">-XX:PermSize64m</span><br><span class="line"><span class="comment">//指定最大永久代大小</span></span><br><span class="line">-XX:MaxPermSize128m</span><br>
//指定永久代初始大小
-XX:PermSize64m
//指定最大永久代大小
-XX:MaxPermSize128m

元空间

元空间使用的是直接内存

<span class="line">1</span><br><span class="line">2</span><br>
<span class="line">1</span><br><span class="line">2</span><br>
1
2
<span class="line"><span class="comment">//指定元空间最大大小,默认无限制直到用光系统内存</span></span><br><span class="line">-XX:MaxMetaspaceSize512m</span><br>
<span class="line"><span class="comment">//指定元空间最大大小,默认无限制直到用光系统内存</span></span><br><span class="line">-XX:MaxMetaspaceSize512m</span><br>
//指定元空间最大大小,默认无限制直到用光系统内存
-XX:MaxMetaspaceSize512m

打印GC日志

jdk9之前

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br>
1
2
3
4
5
6
7
8
<span class="line"><span class="comment">//打印简单GC日志</span></span><br><span class="line">-XX:+PrintGC</span><br><span class="line"></span><br><span class="line"><span class="comment">//打印GC日志详情</span></span><br><span class="line">-XX:+PrintGCDetails</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取堆信息</span></span><br><span class="line">-XX:+PrintHeadAtGC</span><br>
<span class="line"><span class="comment">//打印简单GC日志</span></span><br><span class="line">-XX:+PrintGC</span><br><span class="line"></span><br><span class="line"><span class="comment">//打印GC日志详情</span></span><br><span class="line">-XX:+PrintGCDetails</span><br><span class="line"></span><br><span class="line"><span class="comment">//获取堆信息</span></span><br><span class="line">-XX:+PrintHeadAtGC</span><br>
//打印简单GC日志
-XX:+PrintGC

//打印GC日志详情
-XX:+PrintGCDetails

//获取堆信息
-XX:+PrintHeadAtGC

jdk9、jdk10

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
1
2
3
4
5
<span class="line"><span class="comment">//打印简单日志</span></span><br><span class="line">-Xlog:gc</span><br><span class="line"></span><br><span class="line"><span class="comment">//打印日志详情</span></span><br><span class="line">-Xlog:gc*</span><br>
<span class="line"><span class="comment">//打印简单日志</span></span><br><span class="line">-Xlog:gc</span><br><span class="line"></span><br><span class="line"><span class="comment">//打印日志详情</span></span><br><span class="line">-Xlog:gc*</span><br>
//打印简单日志
-Xlog:gc

//打印日志详情
-Xlog:gc*

GC日志查看

注意:因为GC日志输出时机的原因,显示的数据可能并不准确,有问题的地方需要重新校对

DefNew
DefNew :新生代

eden
eden
from
from
to
to

Tenured
Tenured :老年代

Perm
Perm :永久代

类加载/卸载追踪

jdk9之前

<span class="line">1</span><br>
<span class="line">1</span><br>
1
<span class="line">-XX:+TraceClassLoading</span><br>
<span class="line">-XX:+TraceClassLoading</span><br>
-XX:+TraceClassLoading

jdk9、jdk10

<span class="line">1</span><br>
<span class="line">1</span><br>
1
<span class="line">-Xlog:<span class="class"><span class="keyword">class</span>+<span class="title">load</span></span>=info</span><br>
<span class="line">-Xlog:<span class="class"><span class="keyword">class</span>+<span class="title">load</span></span>=info</span><br>
-Xlog:class+load=info

柱状图分析

<span class="line">1</span><br><span class="line">2</span><br>
<span class="line">1</span><br><span class="line">2</span><br>
1
2
<span class="line"><span class="comment">//配合在控制台使用ctrl+Break展示信息</span></span><br><span class="line">-XX:+PrintClassHistogram</span><br>
<span class="line"><span class="comment">//配合在控制台使用ctrl+Break展示信息</span></span><br><span class="line">-XX:+PrintClassHistogram</span><br>
//配合在控制台使用ctrl+Break展示信息
-XX:+PrintClassHistogram

查看系统参数

<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
<span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br>
1
2
3
4
5
<span class="line"><span class="comment">//程序运行时展示手动配置的参数</span></span><br><span class="line">-XX:+PrintVMOptions</span><br><span class="line"></span><br><span class="line"><span class="comment">//自动配置&手动配置的参数都展示</span></span><br><span class="line">-XX:+PrintCommandLineFlags</span><br>
<span class="line"><span class="comment">//程序运行时展示手动配置的参数</span></span><br><span class="line">-XX:+PrintVMOptions</span><br><span class="line"></span><br><span class="line"><span class="comment">//自动配置&手动配置的参数都展示</span></span><br><span class="line">-XX:+PrintCommandLineFlags</span><br>
//程序运行时展示手动配置的参数
-XX:+PrintVMOptions

//自动配置&手动配置的参数都展示
-XX:+PrintCommandLineFlags

如果喜欢这篇文章,可以给作者评个份哦~

原文声明: "转载本站文章请注明作者和出处Nothinglin ,请勿用于任何商业用途"

公众号:苦逼的学生仔