基础知识

image.png

  1. package com.interview.demo;
  2. /**
  3. * @Author leijs
  4. * @date 2022/3/29
  5. */
  6. public class HelloGC {
  7. public static void main(String[] args) throws InterruptedException {
  8. long totalMemory = Runtime.getRuntime().totalMemory();
  9. long maxMemory = Runtime.getRuntime().maxMemory();
  10. System.out.println("-Xms:" + totalMemory + ", " + totalMemory / 1024 / 1024 + "MB");
  11. System.out.println("-Xmx" + maxMemory + ", " + maxMemory / 1024 / 1024 + "MB");
  12. }
  13. }

常用参数

-Xms

初始大小内存,默认为物理内存的1/64
等价于: -XX:InitialHeapSize

-Xmx

最大分配内存,默认为物理内存的1/4
等价于:-XX:MaxHeapSize

-Xss

设置单个线程栈的大小,一般默认512K~1024K
等价于: -XX:ThreadStackSize

  • 默认的栈大小
  • 配置“-Xss128k
  • 栈管运行,堆管存储

image.png
为什么初始是0?
image.png
0代表就是默认出厂初始值,跟平台有关

-Xmn

  • 设置年轻代的大小,一般不需要去调节

    -XX:MetaspaceSize

  • 设置元空间大小。元空间的本质和永久代类似,都是JVM规范中方法去的实现。不过元空间和永久代之间最大的区别:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受限于本地内存。

  • -Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal
  • 元空间初始默认:约21M

    -XX:+PrintGCDetails

    设置堆内存最大10M,然后new一个50M的大对象,发现出现了GC
    1648605867(1).png
    image.png
    日志:
    image.png
    总共堆内存10M,新生区占1/3,老年代占2/3
    image.png
    image.png
    解析日志:
    [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

1648606665(1).png

  • 调整新生代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相同

设置demo:
image.png
1648607127(1).png

-XX:NewRatio

  • 配置年轻代和老年代在堆结构的占比
  • 默认-XX:NewRatio=2,新生代占1,老年代占2,年轻代占整个堆的1/3
  • 例如:-XX:NewRatio=4 新生代占1,老年代4,年轻代占整个堆的1/5

NewRatio值就是设置老年代的占比,剩下的1给新生代
image.png
image.png

-XX:MaxTenuringThreshold

  • 设置默认进入老年代的最大年龄
  • 值只能是1-15

    典型设置

    image.png