3.1 JVM中对象的创建过程:

-XX:+UseTLAB
允许在年轻代空间中使用线程本地分配块(TLAB)。默认情况下启用此选项。要禁用 TLAB,请指定-XX:-UseTLAB。
3.2 判断对象的存活


3.3 finalize()方法
在垃圾回收前调用,方法执行缓慢,还没有完成拯救,垃圾回收器就已经回收掉了(要加sleep)。而且只被拯救一次
public class FinalizeGC {public static FinalizeGC instance = null;public void isAlive(){System.out.println("I am still alive!");}@Overrideprotected void finalize() throws Throwable{super.finalize();System.out.println("finalize method executed");FinalizeGC.instance = this;}public static void main(String[] args) throws Throwable {instance = new FinalizeGC();//对象进行第1次GCinstance =null;System.gc();Thread.sleep(3000);//Finalizer方法优先级很低,需要等待if(instance !=null){instance.isAlive();}else{System.out.println("I am dead!");}//对象进行第2次GCinstance =null;System.gc();// Thread.sleep(1000);if(instance !=null){instance.isAlive();}else{System.out.println("I am dead!");}}}
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
/*** @author King老师* 逃逸分析-栈上分配* -XX:-DoEscapeAnalysis -XX:+PrintGC*/public class EscapeAnalysisTest {public static void main(String[] args) throws Exception {long start = System.currentTimeMillis();for (int i = 0; i < 50000000; i++) {//5000万次---5000万个对象allocate();}System.out.println((System.currentTimeMillis() - start) + " ms");Thread.sleep(600000);}static void allocate() {//逃逸分析(不会逃逸出方法)//这个myObject引用没有出去,也没有其他方法使用MyObject myObject = new MyObject(2020, 2020.6);}static class MyObject {int a;double b;MyObject(int a, double b) {this.a = a;this.b = b;}}}
cms只回收老年代
是否为大对象的大小设置 -XX:PretenureSizeThreshold=4m
关于本地线程分配缓冲:参考cndn博客
https://blog.csdn.net/qq_38718462/article/details/106978745
