基础知识
package com.interview.demo;
/**
* @Author leijs
* @date 2022/3/29
*/
public class HelloGC {
public static void main(String[] args) throws InterruptedException {
long totalMemory = Runtime.getRuntime().totalMemory();
long maxMemory = Runtime.getRuntime().maxMemory();
System.out.println("-Xms:" + totalMemory + ", " + totalMemory / 1024 / 1024 + "MB");
System.out.println("-Xmx" + maxMemory + ", " + maxMemory / 1024 / 1024 + "MB");
}
}
常用参数
-Xms
初始大小内存,默认为物理内存的1/64
等价于: -XX:InitialHeapSize
-Xmx
最大分配内存,默认为物理内存的1/4
等价于:-XX:MaxHeapSize
-Xss
设置单个线程栈的大小,一般默认512K~1024K
等价于: -XX:ThreadStackSize
- 默认的栈大小
- 配置“-Xss128k
- 栈管运行,堆管存储
-Xmn
-
-XX:MetaspaceSize
设置元空间大小。元空间的本质和永久代类似,都是JVM规范中方法去的实现。不过元空间和永久代之间最大的区别:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受限于本地内存。
- -Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal
- 元空间初始默认:约21M
-XX:+PrintGCDetails
设置堆内存最大10M,然后new一个50M的大对象,发现出现了GC
日志:
总共堆内存10M,新生区占1/3,老年代占2/3
解析日志:
[GC (Allocation Failure) [PSYoungGen: 1751K->488K(2560K)] 1751K->767K(9728K), 0.0195233 secs] [Times: user=0.00 sys=0.00, real=0.02 secs]
新生区:GC前1751K GC后488K ,总共2560K 堆:GC前1751K GC后767K,总共堆9728K
老年代都扛不住了,就OOM
-XX:SurvivorRatio
- 调整新生代Eden区和survivor区的比例,默认8:1:1
默认:-XX:SurvivorRatio=8 Eden:S0:S1=8:1:1
例如:
-XX:SurvivorRatio=4 Eden:S0:S1=4:1:1
Survivorratio值就是设置Eden区的比例占多少,S0/S1相同
-XX:NewRatio
- 配置年轻代和老年代在堆结构的占比
- 默认-XX:NewRatio=2,新生代占1,老年代占2,年轻代占整个堆的1/3
- 例如:-XX:NewRatio=4 新生代占1,老年代4,年轻代占整个堆的1/5