【JVM】JVM调参的常用参数以及Java中的4中引用类型
1. 参数类型
标配参数:
-version-help\java -showversionX参数:
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
强引用(Strong Reference)
强引用是指在程序代码中普遍存在的,类似“Object obj=new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。但是你可以使用obj = null
来辅助JVM进行回收。软引用(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()); } }
- 弱引用(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
- 虚引用(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()); } }