感觉这位大佬写的特别好https://www.cnblogs.com/wjtaigwh/p/6635484.html
GC通过确定对象是否被活动对象引用来确定是否收集该对象。
触发GC(Garbage Collector)的条件
1)GC在优先级最低的线程中运行,一般在应用程序空闲即没有应用线程在运行时被调用。
2)Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制调用GC线程。
若GC一次之后仍不能满足内存分配,JVM会再进行两次GC,若仍无法满足要求,则JVM将报“out of memory”的错误,Java应用将停止。
GC内部会分成(young)和(old)区域,因为新生区大部分数据都会死掉,所以只有长期存活在young区的数据才会转移到old区
减少GC开销
1.少用临时变量
2.对象不用时改为null
3.用StringBuffer代替String
4.尽量少用静态变量,因为不会被GC回收