java虚拟机之垃圾回收算法】的更多相关文章

Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这三个区域的内存分配和回收都具有确定性.垃圾回收重点关注的是堆和方法区部分的内存. 常用的垃圾回收算法有: (1).引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不再被使用的,垃…
1.引用计数法 这是个比较古老而经典的垃圾回收算法,其核心就是在对象被其他所引用的时候计数器加1,而当引用失去时减1.这个方法有非常严重的问题:无法此话有理循环引用的情况,还有就是每次进行加减操作比较浪费系统性能. 2.标记清除法 分为标记和清除两个阶段进行回收内存中的对象,这个方法也有很大的弊端,就是空间碎片问题,垃圾回收后的空间不是连续的,不连续的内存空间的工作效率要低于连续的内存空间. 3.复制算法 其核心思想就是将内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的保…
标记-清除算法: 这是最基础的,就是之前所讲的两次标记,首先标记出所有 需要回收的对象,然后进行统一清除, 这有两缺点:一是效率低,标记和清除(开启低优先级进行回收)都是低效率的.第二是空间问题,标记清除会产生大量的内存碎片.   复制算法: 可以将内存分为大小相等的两块,每次只使用一块,当一快内存使用完之后,将存活的对象移到另一块, 然后将使用过的一块用垃圾回收器将其回收掉. 这种方式运行简单,效率高.缺点是缩小了内存的实际使用大小. 比如使用20M的内存,每次都只能使用10M. 并且在对象存…
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前,我们一定得确定哪些是活着的对象,又有哪些是可以进行回收的. 判断对象是否存活方式 引用计数算法 对应判断一个对象是否可以回收,我想引用计数一定是最容易被想到的算法了吧.给每个对象加一个引用计数器,每当有一个地方引用它时,计数器就加 1,引用失效后减 1,当对象的计数器为 0,则说明这个对象可以被回…
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这些程序包括:实用程序.游戏.商业应用程序.在全世界范围内,Java运行在超过数十亿台个人计算机上,数十亿台设备上,还包括手机和电视设备.Java由一系列的关键组件作为一个整体构建出了Java平台. Java Runtime Edition 当你下载Java,你就得到了Java运行环境(JRE).JR…
类加载机制 双亲委派模型 垃圾回收算法 CMS G1 类加载机制 双亲委派模型 双亲委派模型: 需要加载一个类,先委托父类加载,父类找父类,依次递归加载;加载不到再由自己加载 垃圾回收算法 JVM的内存结构包括五大区域:程序计数器.虚拟机栈.本地方法栈.堆区.方法区. 程序计数器.虚拟机栈.本地方法栈, 随线程来,随线程去,不用关心 堆区 使用引用计数法.可达分析法进行回收 方法区 需要操作回收 a.标记-清除算法(Mark-Sweep) b.复制算法(Copying) c.标记-整理算法(Ma…
一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和GC Roots之间没有链接,那么这个对象也可以被视作是一个可回收的对象. Java中可以被作为GC Roots中的对象有: 虚拟机栈中的引用的对象. 方法区中的类静态属性引用的对象. 方法区中的常量引用的对象. 本地方法栈(jni)即一般说的Native的引用对象. 二.垃圾回收器 Serial收…
做一个java程序员很是幸福,不用管不用的对象如何被回收,但是我认为了解一下也不是坏事. 一.如何判断对象已经死亡? 在进行垃圾回收之前,第一件事肯定是判断对象是否已经死亡.1.引用计数算法给对象添加一个引用计数器,当程序中使用到这个对象的时候,计数器+1:如果引用失效,计数器-1,当计数器为0时,说明程序中不再使用这个对象,既可以回收.问题:试想一下,当A对象中使用B对象,B对象中有方法使用A对象,完犊子,两个对象永远存在. 2.可达性分析算法(主流的商用程序语言的主流实现,都是基于此算法)通…
什么样的对象需要回收 如果对象已经死亡了,就可以进行回收,判断方式如下 1).引用计数器:给对象添加一个计数器,有地方引用,就+1,当引用失效,就-1.当计数器为0时,判断对象不能再使用,但是当对象相互引 用的时候无法进行GC 1).可达性算法:从GC Roots开始,到对象之间有引用链相连,就是可达的.HotSpot采用可达性算法,商用虚拟机没有采用引用计数器 哪些对象能作为GC Roots: 1).局部变量表中引用的对象 2).栈帧中常量引用的对象 3).栈帧中静态变量引用的对象 4).JN…
简述 Java与那些较传统的语言比如C++有个很大不同就是垃圾回收策略了.前者通常是虚拟机自动帮我们做了,而后者就需要我们手动来完成. Java虚拟机帮我们完成了垃圾回收,是不是意味着我们就不用完全去管它了呢?当然不是的.在很多场景下,虚拟机默认做的并不能使我们满意.比如某个java应用较大时,频繁产生GC,就会非常影响我们应用的响应速度.这时候就需要我们根据自身需要,进行相应的调整.那么如何调整呢?这就需要我们对虚拟机的垃圾回收机制有所了解了. 找到将要回收的对象 如何找到要回收的对象呢?这里…