java垃圾收集相关问题

一、概述

java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。

二、对象死亡判定

1、引用计数算法

(1)判定算法:给对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不能再被使用的。

(2)缺点            a,很难解决对象之间相互循环引用的问题。如下:

  1. class TestA{
  2. public TestB b;
  3. }
  4. class TestB{
  5. public TestA a;
  6. }
  7. public class Main{
  8. public static void main(String[] args){
  9. A a = new A();
  10. B b = new B();
  11. a.b=b;
  12. b.a=a;
  13. a = null;
  14. b = null;
  15. }
  16. }

虽然啊a,b都为null,但是由于存在循环引用,所有永远不会回收。

b,浪费CPU,时刻进行计数器计数统计,即使内存够用。

 2、可达性分析算法

(1)算法:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,当一个对象到GC Roots没有任何引用相连时,则证明此对象是不可用的。

注:对象object5、object6、object7虽然互有联系,但是它们到GC Roots不可达,所以它们被判定为可回收的对象。

三、垃圾收集算法

1、标记—清除算法

(1)算法想法:首先标记出所有需要回收的对象,在标记完成后统一回收所有没有被标记的对象,如果对象在进行可达性分析后发现到GC Roots是不可达的,那么它将会被第一次标记并且进行一次筛选,筛选条件是此对象是否有必要执行finalize()方法。当对象没有覆盖此方法,或者已经被虚拟机调用过,这两种情况都被虚拟机视为没有必要执行。如果有必要,那么这个对象将会放置在F-Queue队列之中,稍后GC将对F-Queue中的对象进行第二次小规模标记,如果对象在finalize()中成功与任何一个可达GC Roots的对象建立关联即可,如果还没有建立关联就将被回收。

图示:

 2、复制算法

(1)算法思想:将可用内存块按容量划分为大小相等的两块,每次只是用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

注:将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收是,将Eden和Survivor中还存活的对象一次性地复制到另一个Survivor空间上,最后清理掉Eden和刚用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor大小比例为8:1.

(2)优点:实现简单,运行高效。缺点:将内存缩小为原来一半,代价太高。

图示:

3、标记整理算法

(1)算法思想:标记过程仍然与“标记—清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

图示:

4、分代算法

(1)算法思想:根据对象存活周期的不同将内存划分为几块。一般 是把java对分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

参考文献

【1】《深入理解Java虚拟机》   机械工业出版社   周志明

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

时间: 2025-01-19 15:03:21

java垃圾收集相关问题的相关文章

Java集合相关面试问题和答案

Java集合相关面试问题和答案 面试试题 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实现.集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类.

java接口相关例题

java接口相关习题 interface Graphics{  //接口里面只能用抽象方法  public abstract double area();    }//设置 平面类class PlaneGraphics1{    private String shape; //形状    //构造方法,有参数    public PlaneGraphics1(String shape)    {        this.shape=shape;    }    //无参数    public P

Java Reflection 相关及示例

Java Reflection 相关及示例 前言: 代码有点长.贴出github地址:https://github.com/andyChenHuaYing/scattered-items/tree/master/items-java-reflection 测试目标类:TargetClass.自定义的辅助类比较多.在这里不贴了.篇幅有限.并且测试也简单.因此测试类也没有提及. 一:简介 Java Reflection是针对Class也就是我们平常说的类而言的.用于操作Java中的Class.在Ja

Java集合类相关面试题

1.Collection和Collections的区别 java.util.Collection 是一个集合接口,Collection接口在Java类库中有很多具体的实现,例如List.Set java.util.Collections 是针对集合类的一个帮助类,它提供了一系列的静态方法实现对各种集合的搜索.排序.线程安全化等操作. 2.ArrayList与Vector的区别 这两个类都实现了List接口(List接口继承自Collection接口).它们都是有序集合,它们内部的元素都是可以重复

C#和Java交互相关研究

之前总觉得C#和Java可以交互应用,但是由于时间以及其他方面的原因,一直没有调研.今天抽空搜了一下,终于折腾出来了. 以下是我自己就C#和Java整合的一些提问和分析,如果有不对的地方,请路过的各位大虾给予指出.3Q! 问题来了: 1.C#和Java如何整合? 2.为什么C#(.Net)要和Java整合? 3.Java和C#整合时,Java主要扮演什么角色?C#扮演什么角色? 答案一一揭晓: 1.C#和Java整合大致有4条路可以走. 1.1 把Java包转换为DLL或者EXE后注册为com组

【转】Java垃圾收集器

原文链接 http://www.cnblogs.com/gw811/archive/2012/10/19/2730258.html#top Java垃圾收集器 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.当Lisp还在胚胎时期时,人们就在思考: GC需要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如

Java垃圾收集器之--Garbage-First Collector

简介       Garbage-First(G1)垃圾收集器全面支持JDK7 Upate 4及后续版本.G1收集器是一个服务器形式(server-style)的垃圾收集器,主要用于内存大.多处理器的机器.当您想实现:与应用程序线程并发的执行全局标记,并且有高吞吐量.面向整个堆操作时,它可以满足您高可用性及GC暂停时间的要求. 此举可有效防止中断(GC时的暂停时间)与堆或者实时数据大小成比例增涨. 技术 G1收集器通过如下技术来实现高性能和低暂停时间: 堆被划分成一组相同大小的堆区域(heap

java目录相关操作 示例代码

package org.rui.io; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; /** * 目录列表器 测试 * * @author lenovo * */ //Args:"C:/Users/lenovo/Pictures/screen/*\.jpg" public class DirList { public

Java Thread 相关的函数

构造方法摘要 Thread()          分配新的 Thread 对象. Thread(Runnable target)          分配新的 Thread 对象. Thread(Runnable target, String name)          分配新的 Thread 对象. Thread(String name)          分配新的 Thread 对象. Thread(ThreadGroup group, Runnable target)          分