1. 参数类型

  • 标配参数:
    -version-help\java -showversion

  • X参数:
    图片说明

  • XX参数:
    Boolean类型
    图片说明

    以打印垃圾回收细节为例。使用jps -l锁定需要查看的进程号,使用jinfo –Flag PrintGCDetails + 进程号来查看是否开启打印GCDetails。
    图片说明

    如果没有打开,那么在VM options中添加命令-XX:+PrintGCDetails

图片说明

  • KV设值类型,例如设定堆内存、元空间等。
    -XX: 属性key = 属性值value,例如-XX: MetaspaceSize = 128m-XX: MaxTenuringThreshold = 15

2. 初始默认值

图片说明
图片说明

没有冒号说明是默认的,有说明是修改后的!

图片说明
图片说明
图片说明

3. 堆内存复习

图片说明

堆内存初始大小约为物理内存的64分之1,最大堆内存默认约四分之一。

4. 常用参数清单和配置

1. -Xms和-Xmx

图片说明

((这两个参数最好设置的一样大,避免频繁的GC。**

2. -Xss

图片说明

3. -Xmn

设置新生代大小。

4. -XX:MetaspaceSize

图片说明

5. -XX:+PrintGCDetails

图片说明
图片说明
图片说明

6. -XX:SurvivorRatio

调整eden和survivor区的比例。

图片说明

7. -XX:NewRatio

调整新生代和老年带比例。
图片说明

8. -XX:MaxTenuringThreshold

设置垃圾最大年龄,默认15次,JAVA8设置最高值为15,否则不能启动JVM。

图片说明

9. 再谈4种引用

参考 https://www.jianshu.com/p/e66d03c3e614

  1. 强引用(Strong Reference)
    强引用是指在程序代码中普遍存在的,类似“Object obj=new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
    只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。但是你可以使用obj = null来辅助JVM进行回收。

  2. 软引用(Soft Reference)
    软引用是用来描述一些有用但并不是必需的对象。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。JDK 1.2之后,提供了SoftReference类来实现软引用。

import java.lang.ref.SoftReference;

public class Main {
    public static void main(String[] args) {

        SoftReference<String> sr = new SoftReference<String>(new String("hello"));
        System.out.println(sr.get());
    }
}
  1. 弱引用(WeakReference)
    弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象
import java.lang.ref.WeakReference;

public class Main {
    public static void main(String[] args) {

        WeakReference<String> sr = new WeakReference<String>(new String("hello"));

        System.out.println(sr.get());
        System.gc();                //通知JVM的gc进行垃圾回收
        System.out.println(sr.get());
    }
}

输出结果
hello
null

  1. 虚引用(PhantomReference)
    虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。它不能单独使用也不能通过它访问对象,需引用必须和引用队列联合使用。

图片说明

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;


public class Main {
    public static void main(String[] args) {
        ReferenceQueue<String> queue = new ReferenceQueue<String>();
        PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);
        System.out.println(pr.get());
    }
}