Java虚拟机垃圾回收

2017-12-12  本文已影响0人  Ajinsir

一、内存回收的关注区域

JMM章节中介绍了Java虚拟机内存模型的几个区域,对于程序计数器、虚拟机栈和本地方法栈都是线程私有的,伴随着线程由生到灭,这几个区域的内存分配这回收都有一定确定性(因为所占内存大小基本是编译可知的),因此,内存回收主要的关注对象是堆和方法区。我们只有在程序运行时才能确定会创建哪些对象,这部分内存的分配和回收都是动态的。垃圾收集器主要关注的是这部分内存。

二、对象可被回收的判断标准

  1. 引用计数法

    思想:就是对每个对象添加一个引用计数器,使用该算法的微软的com技术等

    弊端:这种方式存在一个问题就是循环引用,导致内存泄露
  2. 可达性分析法

    思想:就是通过一系列称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。

    Java语言中,可以作为GC Roots对象包括下面几种:
  1. 引用相关知识

    一般意义上讲,引用就代表了一个对象的内存地址或者存有没有对象地址的句柄,但是这种定义导致一个对象只存在引用和未被引用两种状态。而在实际应用中,一个对象需要更多的状态,来提高效率和优化性能。因此,Java引用分为4种:
  1. 对象是否直接死亡

    对于可达性分析算法中不可达的对象,也不是“非死不可”,要真正宣告对象死亡,必须经历两次标记过程。如果可达性分析不可达时,对象会被第一次标记并且进行一次筛选,筛选标准是对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机都将这两种情况视为没有必要执行。如果这个对象被判定位必要执行finalize()方法,则会被放在一个F-Queue队列中,并且会在稍后由一个虚拟机自建的Finalize线程去执行它。一个对象的finalize()方法只会被执行一次,一个对象可以在finalize()完成一次自救,并且只能自救一次。

三、垃圾回收

  1. 回收方法区

    方法区的回收对象主要是废弃常量和无用的类。对于一个字符串常量“hello”,如果当前系统中没有任何一个String对象叫做“hello”,那么就认为没有任何对象引用常量池中的“hello”常量,这时该常量就是废弃常量。无用的类的判断标准则比较复杂,需要满足一下条件:
  1. 垃圾收集算法
  1. 垃圾收集器

4.GC 日志

关键点:GC、Full GC、回收前的容量、回收后的容量、总的容量、回收的区域、回收时间a

上一篇 下一篇

猜你喜欢

热点阅读