<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 | <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> //指定堆最大 |
指定线程的栈最大空间
<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 | <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 |
影响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 | <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 |
永久代
<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 | <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> //指定永久代初始大小 |
元空间
元空间使用的是直接内存
<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 | <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> //指定元空间最大大小,默认无限制直到用光系统内存 |
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 | <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日志 |
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 | <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> //打印简单日志 |
注意:因为GC日志输出时机的原因,显示的数据可能并不准确,有问题的地方需要重新校对
DefNew
:新生代
eden
、 from
、 to
Tenured
:老年代
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 | <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展示信息 |
<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 | <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> //程序运行时展示手动配置的参数 |
<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 | <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> //指定堆最大 |
指定线程的栈最大空间
<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 | <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 |
影响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 | <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 |
永久代
<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 | <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> //指定永久代初始大小 |
元空间
元空间使用的是直接内存
<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 | <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> //指定元空间最大大小,默认无限制直到用光系统内存 |
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 | <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日志 |
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 | <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> //打印简单日志 |
注意:因为GC日志输出时机的原因,显示的数据可能并不准确,有问题的地方需要重新校对
DefNew
:新生代
eden
、 from
、 to
Tenured
:老年代
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 | <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展示信息 |
<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 | <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> //程序运行时展示手动配置的参数 |