写在开头
基本定义
在开始梳理内存分配规则之前,还是需要先强调一下JVM的的两种垃圾回收机制(因为jvm很多内存机制也是为了保证gc 触发的合理性设计的):
- minor gc:即新生代内存垃圾回收,执行频率较高,而且执行速度快,对系统性能影响较小
- full gc:此回收方式会回收 老年代、新生代、方法区三块内存区域的垃圾,因为扫描的区域的,因此效率比较低下
JVM内存分配
当新生代空间不足时,所有新生代对象直接移入老年代
survivor将对象直接移入老年代
JVM对象回收机制
上面讲了JVM如何进行内存分配,那上文中多次提到的gc过程中,JVM又是如何识别出当前对象为垃圾对象,可以执行回收操作呢?其实JVM判断对象是否回收有两种方法:
- 引用计数法(目前我们用到的主流虚拟机未使用此方法):此方法的原理就是如果某对象被引用了,则当前对象的计数器+1,当当前对象的计数器指数为0时,代表此对象已不在可能被使用,可以被回收。不过此方法无法解决对象互相依赖的问题,会导致大量对象无法回收,所以目前很少被使用
- 可达性分析算法:此算法的核心思想是所有的有效对象都必须存在”GC Root”作为起点,即JVM会标记所有的GC ROOT以及其所有的子节点 为非垃圾对象,JVM在进行GC时,只要没有被标记为非垃圾对象的对象,都属于垃圾对象,将其进行回收
- 此处解释一下什么是GCRoot节点,比如线程栈的本地变量、静态变量等
JVM常见的引用类型
- 强引用:我们写的业务代码中,例如 User user = new User() 这种就属于强引用
- 软引用:软引用需要使用SoftReference 进行声明 例如下面这种形式, 弱引用的优势在于,当jvm堆的新生代或者老年代区域不足时,会优先回收软引用的内存对象,软引用主要应用于”需要提高系统使用性能,且当前对象又不是系统必要业务对象,内存不足时可先回收掉,后续重新加载即可”的业务场景中,例如非关键数据的缓存
- SoftReference<User> user = new SoftReference<User>(new User())
- 弱引用:弱引用的对象在进行gc时就会被回收掉,应用场景非常少,个人没用过
- 虚引用:没用过,也没听到什么使用场景,有兴趣了解可以百度
方法区内存回收机制
方法区主要是回收不会在被使用的类元信息,判定某类不被使用需要满足三个条件:
- 所有的实例对象需要被回收,即new出来的对象需要被回收
- 该类的classloader被回收
- 该类的class对象也需要被回收
以上就是JVM内存分配机制以及回收机制的所有内容了,后面分析的是JVM垃圾回收算法和垃圾收集器了~
声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!