3.1 JVM中对象的创建过程:

image.png
-XX:+UseTLAB
允许在年轻代空间中使用线程本地分配块(TLAB)。默认情况下启用此选项。要禁用 TLAB,请指定-XX:-UseTLAB。

3.2 判断对象的存活

image.png
image.png

3.3 finalize()方法

在垃圾回收前调用,方法执行缓慢,还没有完成拯救,垃圾回收器就已经回收掉了(要加sleep)。而且只被拯救一次

  1. public class FinalizeGC {
  2. public static FinalizeGC instance = null;
  3. public void isAlive(){
  4. System.out.println("I am still alive!");
  5. }
  6. @Override
  7. protected void finalize() throws Throwable{
  8. super.finalize();
  9. System.out.println("finalize method executed");
  10. FinalizeGC.instance = this;
  11. }
  12. public static void main(String[] args) throws Throwable {
  13. instance = new FinalizeGC();
  14. //对象进行第1次GC
  15. instance =null;
  16. System.gc();
  17. Thread.sleep(3000);//Finalizer方法优先级很低,需要等待
  18. if(instance !=null){
  19. instance.isAlive();
  20. }else{
  21. System.out.println("I am dead!");
  22. }
  23. //对象进行第2次GC
  24. instance =null;
  25. System.gc();
  26. // Thread.sleep(1000);
  27. if(instance !=null){
  28. instance.isAlive();
  29. }else{
  30. System.out.println("I am dead!");
  31. }
  32. }
  33. }

3.4 各种引用

强引用
一般的 Object obj = new Object() ,就属于强引用。在任何情况下,只有有强引用关联(与根可达)还在,垃圾回收器就永远不会回收掉被引用的对象。

软引用 SoftReference
一些有用但是并非必需,用软引用关联的对象,系统将要发生内存溢出(OuyOfMemory)之前,这些对象就会被回收(如果这次回收后还是没有足够的
空间,才会抛出内存溢出)。参见代码: VM 参数 -Xms10m -Xmx10m -XX:+PrintGC

弱引用 WeakReference
一些有用(程度比软引用更低)但是并非必需,用弱引用关联的对象,只能生存到下一次垃圾回收之前,GC 发生时,不管内存够不够,都会被回收。

虚引用 PhantomReference
幽灵引用,最弱(随时会被回收掉)
垃圾回收的时候收到一个通知,就是为了监控垃圾回收器是否正常工作。

3.4对象的分配策略

逃逸分析的原理:分析对象动态作用域,当一个对象在方法中定义后,它可能被外部方法所引用。
比如:调用参数传递到其他方法中,这种称之为方法逃逸。甚至还有可能被外部线程访问到,例如:赋值给其他线程中访问的变量,这个称之为线程逃逸。
从不逃逸到方法逃逸到线程逃逸,称之为对象由低到高的不同逃逸程度。
如果确定一个对象不会逃逸出线程之外,那么让对象在栈上分配内存可以提高 JVM 的效率。
-XX:+PrintGC -XX:-DoEscapeAnalysis
-XX:+PrintGC -XX:+DoEscapeAnalysis

  1. /**
  2. * @author King老师
  3. * 逃逸分析-栈上分配
  4. * -XX:-DoEscapeAnalysis -XX:+PrintGC
  5. */
  6. public class EscapeAnalysisTest {
  7. public static void main(String[] args) throws Exception {
  8. long start = System.currentTimeMillis();
  9. for (int i = 0; i < 50000000; i++) {//5000万次---5000万个对象
  10. allocate();
  11. }
  12. System.out.println((System.currentTimeMillis() - start) + " ms");
  13. Thread.sleep(600000);
  14. }
  15. static void allocate() {//逃逸分析(不会逃逸出方法)
  16. //这个myObject引用没有出去,也没有其他方法使用
  17. MyObject myObject = new MyObject(2020, 2020.6);
  18. }
  19. static class MyObject {
  20. int a;
  21. double b;
  22. MyObject(int a, double b) {
  23. this.a = a;
  24. this.b = b;
  25. }
  26. }
  27. }

cms只回收老年代
image.png
是否为大对象的大小设置 -XX:PretenureSizeThreshold=4m

关于本地线程分配缓冲:参考cndn博客
https://blog.csdn.net/qq_38718462/article/details/106978745