JVM(3) --内存回收

那些内存需要回收

内存回收是对运行时内存区域的内存回收,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊的执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。
而Java堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法的多个分支需要的内存可能也不一样,我们只有在程序运行时才知道会创建哪个对象,这部分内存的分配和回收都是动态的,垃圾收集器需要回收的内存就这堆上的内存。

哪些对象已死?哪些对象还活着

Java垃圾收集器在进行内存回收的时候,需要对内存进行判别,判断他是活着的还是已死的,即是可回收的还是不可回收的,下面是判断对象存活与否的方法。

  • 引用计数算法

    给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为0的对象就是不可能再被使用的。但是它很难解决对象间相互循环引用的问题。

  • 可达性分析算法

    在主流的商用语言(Java,c#, lisp)中是通过可达性分析算法来判断对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索搜走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明对象是不可用的。
    在Java语言中,可作为GC Roots的对象包括下面几种

  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI(即一般说的native方法)引用的对象
  • 引用探索

    在java1.2以前,java中的引用的定义很传统:如果reference类型的数据中存储的是另一块内存的起始地址,就称这块内存代表着一个引用;这种定义很纯粹,但是太过于狭隘,一个对象在这种定义下只有被引用和没有被引用两种状态,对于表示一些"食之无味,弃之可惜"的对象就显得无能为力;其实我们希望还能描述其他的一些状况:当内存空间还足够时,则留在内存空间中;如果内存空间进行垃圾收集以后还是很紧张,则可以抛弃这些对象,于是我们这些对象的引用分为4个等级,4中引用强度一次削弱;

  1. 强引用:强引用在程序代码中是普遍存在的,类似“Object o = new Object()”,只要强引用还在,垃圾回收器永远不会回收这类被引用的对象;
  2. 软引用:软引用是用来描述一些还有用但是非必须的对象。对于软引用的对象,在系统将要发生内存溢出异常之前,将会把这些对象列入回收范围内进行第二次回收。如果系统回收后还是没有足够的内存,系统将会抛出内存溢出异常,jdk1.3以后提供了SotfReference类来实现软异常。
  3. 弱引用:弱引用也是用来描述一些非必须的对象,但是它的强度比软引用还要弱一点,被弱引用关联的对象只能生存到下一次垃圾收集器之前。jdk1.2之后提供了WeakReference类实现弱引用
  4. 虚引用:目的就是能在对象被收集器回收之前收到一个系统通知。jdk1.2后提供了PhantonReference类来实现虚引用。

原文地址:https://www.cnblogs.com/curiousforcode/p/12008061.html

时间: 2024-10-02 08:36:57

JVM(3) --内存回收的相关文章

图解JVM垃圾内存回收算法

图解JVM垃圾内存回收算法 这篇文章主要介绍了图解JVM垃圾内存回收算法,由于年轻代堆空间的垃圾回收会很频繁,因此其垃圾回收算法会更加重视回收效率,下面博主和大家来一起学习一下吧 前言 首先,我们要讲的是JVM的垃圾回收机制,我默认准备阅读本篇的人都知道以下两点: JVM是做什么的 Java堆是什么 因为我们即将要讲的就是发生在JVM的Java堆上的垃圾回收,为了突出核心,其他的一些与本篇不太相关的东西我就一笔略过了 众所周知,Java堆上保存着对象的实例,而Java堆的大小是有限的,所以我们只

Java工作原理:JVM,内存回收及其他

JAVA虚拟机系列文章 http://developer.51cto.com/art/201001/176550.htm Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很好地适应各种Web应用.同时,为了提高Java语言的性能和健壮性,还引入了如垃圾回收机制等新功能,通过这些改进让Java具有其独特的工作原理. 1.Java虚拟机 Java虚拟机(Java Virtual Machine,JVM)是软件模拟的计算机,它可以在任何处理器上(无论是在计算机中还是在其他电子设备中)安全兼

JVM的内存回收机制

垃圾回收机制,简称gc.对堆与方法区的对象进行回收,因为java不像c需要编程人员手动clear,虚拟机通过垃圾回收算法,对堆与方法区的对象进行自动回收处理. 1.引用计数法(jvm没有采用,因为当两个对象相互引用的时候,它们的引用数量永远为1,这样就不会被自动回收,会造成内存泄漏.) 意思就是,对对象的引用数量进行计数,引用一次+1,减少一个引用则-1,当一段时间引用数量为0时,则认为该对象可被回收. 2.可达性分析法(jvm采用的就是该算法) 通过一系列的称为 “GC Roots” 的对象作

JVM的内存区域划分以及垃圾回收机制详解

在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以及ARC(自动引用计数)的内存管理方式,下方会对其进行回顾.而目前的JVM的内存回收机制则不是使用的引用计数,而是主要使用的"复制式回收"和"自适应回收". 当然除了上面是这两种算法外,还有其他是算法,下方也将会对其进行介绍.本篇博客,我们先简单聊一下JVM的区域划分,

2 - JVM随笔分类(JVM堆的内存回收)

JVM常用的回收算法是: 标记/清除算法 标记/复制算法 标记/整理算法 其中上诉三种算法都先具备,标记阶段,通过标记阶段,得到当前存活的对象,然后再将非标记的对象进行清除,而对象内存中对象的标记过程,则是使用的  “根搜索算法”,通过遍历整个堆中的GC ROOTS,将所有可到达的对象标记为存活的对象的一种方式,则是 “根搜索算法”,其中根是指的“GC ROOTS”,在JAVA中,充当GC ROOTS的对象分别有:“虚拟机栈中的引用对象”,“方法区中的类静态属性引用的对象”,“方法区中的常量引用

一张图让你看懂JVM之垃圾回收算法详解

前言 从上面这个图我们总体上对JVM的结构特别是内存结构有了比较清晰的认识,虽然在JDK1.8+的版本中,JVM内存管理结构有了一定的优化调整.主要是方法区(持久代)取消变成了直接使用元数据区(直接内存)的方式,但是整体上JVM的结构并没有大改,特别是我们最为关心的堆内存管理方式并没有在JDK1.8+的版本中有什么变化,所以图中的结构整体上是没有什么不准确的,之所以将方法区以及持久代标注出来,主要还是为了起到对比认识的作用,大家知道就可以了. 关于持久代元数据区的使用问题,目前可以理解就是使用的

第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 方法区:回收两样东西 无用的类 废弃的常量 栈和PC寄存器是线程私有区域,不发生GC 2.怎样判断对象是否存活 垃圾回收:回收掉死亡对象所占的内存.判断对象是否死亡,有两种方式: 引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值+1:引用失效时,计数器值-1 实际中不用,不用的两

JVM的内存结构,JVM的回收机制

内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收.GC),这对于开发人员来说确实大大降低了编写程序的难度,但带来的一个副作用就是,当系统运行过程中出现JVM抛出的内存异常(例如OutOfMemoryError)的时候,很难知道原因是什么,另外一方面,要编写高性能的程序,通常需要借助内存来提升性能,因此如 何才能合理的使用内存以及让JVM合理的进行

jvm内存回收机制

Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop