`
买切糕的猴子
  • 浏览: 23080 次
社区版块
存档分类
最新评论

java虚拟机-垃圾回收机制

    博客分类:
  • java
阅读更多
     我们都知道Java使用的是垃圾自动回收机制,开发者无需像C程序员一样时时刻刻关心何时做垃圾回收。但是作为一名Java程序员了解JVM的垃圾回收机制是一件非常必要的事情,对于分析系统发生OM的问题,内存泄漏等问题时会非常有帮助。
     对于垃圾回收,我们比较关心的是以下几个问题:
          1、回收些什么玩意?
          2、什么时候回收?
          3、怎样回收?
 
一、回收什么玩意?
     Java是面向对象的语言,那么它的垃圾回收当然是回收那一个个被创建出来的对象实例。在了解垃圾回收机制之前建议先看看JVM的内存管理,否则有些地方看起来会比较费劲。在JVM规范中的内存管理定义了本地方法栈,虚拟机栈,程序计数器,方法区,java堆,直接内存这几个主要的内存分配模块,其中本地方法栈,虚拟栈,程序计数器随着线程而生,随线程而灭,这几个地方基本不需要过多的考虑GC,因为随着线程的结束,他们所占用的内存自然就释放了,所以GC对象的主要战场就是方法区里存放的类信息,常量,静态变量和java堆里的对象实例。
 
二、什么时候回收?
     在java堆和方法区中存放的那些对象,JVM是怎么知道他们现在是没有用的垃圾了呢?这里就介绍两种判定方式,分别是引用计数算法和可达性分析算法
 
引用分析算法
     给对象添加一个引用计数器,当有其它对象引用它的时候,引用值+1,当引用失效的时候,引用值-1,客观的说引用分析算法确实是一个简单有效的算法,在游戏脚本领域有广泛的使用,但是在Java虚拟机里却没有采用它,原因是它很难解决对象之间互相引用的情况。如下图:
在整个程序中只有它们自己互相引用,并没有其他的地方需要用到它两,从实际角度来说它们属于垃圾对象,但是通过引用计数算法得出的结果它们又不是垃圾,并不会被GC掉,如果这样的垃圾对象一直堆积最终会导致OOM,所以java虚拟机采用的是另外一种算法
 
可达性分析算法
     从一系列的被称为“GC ROOT”对象出发,从这些节点开始向下搜索,搜索所走过的路经称为引用链,当一个对象到GC ROOT上没有任何的引用链时,就判断它为可被回收的垃圾对象。如下图所示:
Object4和Object5就是没有引用链的对象,也就意味着它们将被GC。可怜的小对象吐舌头.
JDK把对象的引用进行了分类,分为强引用,软引用,弱引用,虚引用。下面分别来看看这些引用的区别
     强引用:类似Object1 ob = new Object1(); 这样的引用关系就是强引用,将永远不会被GC
     软引用:描述一些还有用,但是非必需的对象,这些对象在系统即将发生内存溢出异常之前会把他们加入秋后问斩的名单,如果把他们回收后还没有足够的内存,那么就会抛出OutofMemory的异常。
     弱引用:描述一些非必需的对象,当垃圾收集工作器工作的时候,无论当前系统内存是否足够,他们都会被斩首,一群的可怜的娃
     虚引用:最弱的一种引用关系,为一个对象设置虚引用的唯一目的就是在该对象被GC收到一个系统通知。一种累觉不爱的引用关系。
三、如何回收
     通常一个对象要真正的被回收需要经过两次标记。如下图:
每一个对象都继承自Object,Object里有一个finalize()方法,当JVM发现某个对象不可达的时候就会把它标记为可被回收的对象,也就是第一次标记。然后对这些对象进行一次筛选,条件就是是否有必要执行它的finalize()方法。如果没有就直接被干掉,如果有就将他们放入一个叫F-Queue的队列,然后一个虚拟机自动创建一个低优先级的线程去执行他们的finalize()方法,稍后对F-Queue里的对象进行二次标记,把那些执行完还没有引用链的对象干掉。
 
这里值得注意的是虚拟机并不会等F-Queue里的对象全部执行完finalize(),因为如果某个对象的finalize方法里有死循环,则GC将一直处于等待状态,导致整个内存回收系统崩溃。其次是判断是否有必要执行finalize()的方法是看它是已经执行过一次,或者对象没有覆写finalize()方法的都被认为没必要的而被直接被干掉。
 
方法区的回收
     有人认为方法区是永久代,是没有GC的,的确对方法区进行GC的性价比确实不高,但它还是有GC的。对堆中的新生代进行GC基本能挽回70~90%的内存空间,而对永久代的回收就达不到这么高的比例。
     方法区中的回收对象主要有两类:废弃常量和无用类。判断方法区中的常量池中的常量是否为废弃常量只需要判断是否有引用即可,判断无用类则是根据以下三个方面:
          a、java堆中没有该类的实例,也就是该类的实例全部被回收
          b、加载该类的ClassLoader已经被回收
          c、该类对应的java.lang.Class对象没有地方被引用,无法在任何地方通过反射访问
 
在大量使用反射,动态代理,CGLib等技术的地方都需要虚拟机具有加载类和卸载类的能力,以保证永久代不会内存溢出。
  • 大小: 39.9 KB
  • 大小: 8.7 KB
  • 大小: 33 KB
0
0
分享到:
评论
1 楼 买切糕的猴子 2016-10-12  
写的不错 

相关推荐

    论文研究-嵌入式Java虚拟机的垃圾回收算法的研究 .pdf

    嵌入式Java虚拟机的垃圾回收算法的研究,刘健培,,在嵌入式系统中,需要分析什么样的垃圾回收机制能够适应嵌入式系统的特点,满足系统对于稳定性和性能的要求。本文阐述了嵌入式Jav

    Java性能调优--关于垃圾回收机制的分析和指导

    关于Java垃圾回收机制的分析已经如何针对Java虚拟机来做应用程序的调优,很详细

    java虚拟机垃圾回收详解.docx

    本书主要讲解了java虚拟机垃圾回收机制,垃圾回收器以及java虚拟机的常用配置; Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布。它是Java程序的技术基础,这些程序包括:实用程序、游戏、商业应用...

    java虚拟机垃圾回收详解

    主要讲解了java虚拟机垃圾回收机制,垃圾回收器以及java虚拟机的常用配置

    21天学会Java之(Java SE第四篇):Java虚拟机、垃圾回收机制

    文章目录Java虚拟机(JVM)JVM的基本结构类加载机制类的生命周期类加载器的种类类加载机制运行时数据区(内存分析)垃圾回收机制新生代(Young Generation)老年代(Old Generation)元空间(Meta Space) Java虚拟机...

    JVM虚拟机垃圾回收机制图谱说明

    JVM虚拟机垃圾回收机制图谱说明

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第20节Java虚拟机-高性能Java虚拟机00:02:58分钟 | 第21节Java虚拟机-TaobaoVM00:03:06分钟 | 第22节Java内存区域-简介00:07:56分钟 | 第23节Java内存区域-Java虚拟机栈00:12:04分钟 | 第24节Java内存区域-程序...

    老生常谈Java虚拟机垃圾回收机制(必看篇)

    下面小编就为大家带来一篇老生常谈Java虚拟机垃圾回收机制(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java-jvm虚拟机原理.ppt

    详细介绍了jvm生命周期和体系结构及垃圾回收机制

    java虚拟机详细解析

    关于java虚拟机的详细解析,从内存分析到垃圾回收算法,hotspot虚拟机回收机制的详细分析,欢迎下载!

    java虚拟机知识点整理

    自己看书整理的 java虚拟机精品知识点 java内存区域与内存溢出处理 虚拟机栈和本地方法栈区别 对象定位访问 垃圾收集器GC管理 虚拟机GC垃圾回收收集算法(内存回收方法论) 虚拟机GC垃圾回收收集器(内存回收具体实现...

    Java高级面试JVM虚拟机、内存结构、垃圾回收机制

    java工程师高级面试之JVM虚拟机底层原理篇:VM种类,内存结构,运行原理,垃圾回收算法,各种垃圾回收器等。

    深入java虚拟机第二版

    第5-20章深入介绍了java的内部细节,垃圾回收、java安全模型、java的连接模型和动态扩张机制,class文件,运算及流程控制。 本书以利于理解的方式深入解释了java虚拟机的内部原理,深入理解这些内容,将对读者更...

    谈谈你对垃圾回收机制的了解?.docx

    一, 垃圾回收机制 在系统运行过程中会产生一些无用的对象,这些对象一直占用内存,不清理这些无用的对象可能会导致内存耗尽,所有垃圾回收机制的是内存. 垃圾收集的原理和概念 对于对象实例收集.主要有两种基本算法,...

    JVM-Java虚拟机

    资源概要:JVM基础知识;类加载子系统;运行时数据区;对象的创建流程与内存分配;...从广义上讲Java,Kotlin、Clojure、JRuby、Groovy等运行于Java虚拟机上的编程语言及其相关的程序都属于Java技术体系中的一员。

    Java 虚拟机学习笔记:Java 内存区域,垃圾收集,内存分配与回收策略,JVM 调优,文件结构,类加载机制,Java 程序

    它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...

    JAVA--达内培训笔记

    (4)垃圾回收机制 --- 自动垃圾收集,永远不会出现内存泄露的问题 4、虚拟机 java语言是先编译后解释,java源码是通过编译生成一种特殊的.class的中间字节码文件,然后再由JVM进行解释运行。 (编译) (解释...

    JVM虚拟机,经典java虚拟机

    JVM虚拟机,经典java虚拟机,了解java的运行机制及详细内存分配和垃圾回收

    深入理解Java虚拟机精华知识点

    从架构角度来看,Java虚拟机主要包括类加载器、运行时数据区、执行引擎、垃圾收集器等部分。类加载器负责将字节码文件加载到内存中,运行时数据区用于存储程序执行时所需的数据,执行引擎则负责执行字节码文件,而...

Global site tag (gtag.js) - Google Analytics