JAVA 内存回收

参考:https://www.cnblogs.com/leesf456/p/5218594.html

1,JMV 中哪些可以作为 GC Root?

    1. 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。

    2. 方法区中的类静态属性引用的对象。

    3. 方法区中常量引用的对象。

    4. 本地方法栈中JNI(Native方法)引用的对象。

2,对象的引用:

    强引用

    弱引用:在内存溢出前(会尝试回收部分内存)

    软引用:在下一次垃圾搜集时

    虚引用:垃圾回收时,收到系统通知。

3, java 垃圾回收算法: 引用计数算法 和 根可达性算法。 引用计数算法是早起的垃圾回收算法,在对象出现循环引用的情况下,不方便回收。 根搜索算法,从根节点开始搜索引用的节点,没有被引用的节点,则是可回收的节点。

  • 标记清除算法:mark & sweep : 效率高,对不使用的对象直接清除,会造成内存碎片。
  • 标记整理算法:collection : 在标记后,将存活的对象向左边移动。解决了内存碎片问题,但是成本更高。
  • 复制算法:将内存分成空闲区和对象区,在gc的时候,总是copy存活的对象到空闲区,因此空闲区域和对象区域总是对调。
  • 分代回收策略:年轻代,老年代,持久代。

    在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

    2.内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

    持久代(Permanent Generation)

    用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。

猜你喜欢

转载自my.oschina.net/u/592116/blog/2250379