java 闲谈GC
写这篇文章之前,我想从栈内存,堆内存,和方法区来阐述GC机制,如果能和多线程挂上钩便是好极了,但是在JVM就不做过多的阐述,毕竟现在能力暂时不会涉及到JVM调优的水平
栈内存:我们日常定义基本数据类型,数组的引用,和引用数据类型便会在上面,还有方法运行的时候的局部变量,就是前面所说的那些日常定义
堆内存:我们日常new对象实例和数组实例的时候,便是在这个上面new一段内存进行存储,但是被final修饰之后的变量也好,常量也好,都会在堆内存中
两者回收上的区别:栈内存都是定长,按顺序来存储的,所以不存在GC回收(就像多米诺骨牌一样);但是在堆内存中,就随机分配位置,且是不定长的,所以需要进行GC回收
》
接下来专心从栈上面说GC:
首先我们new出来一个对象的实例,这里我打比方来说吧,这时候他是个婴儿(新生代),婴儿出生的时候会在伊甸园里,伊甸园就是一个Eden(内存占比最大,其余两个稍小),然后进行一个 Minor gc,会有生还者,会有一个穷爸爸和一个富爸爸各自拎回家(from survivor region和to survivor region),每经过一次minor GC/Full GC(何时进行Full GC,从)的时候,这个对象就会长一岁,直到他十五岁的时候,就会迈入老生代,或者当survivor中对象的内存和超过一半的时候,会将survivor中超过平均年龄的,按从大到小移到老生代中。而老生代的对象,一般情况下都不会被GC。
GC怎么确定垃圾?
1、即一个对象如果没有任何与之关联的引用,即他们的引用计数都不为 0,则说明对象不太可能再被用到,那么这个对象就是可回收对象。
2、gc确定一个对象没有使用的途径的次数达到两次以上,那么这个对象就是可回收对象
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
谢谢左右网友的建议!!!
欢迎各位码农提出疑问,一起踏上填坑之路!!!