`
shuchaoo
  • 浏览: 41370 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java垃圾回收机制小结

阅读更多

最近找工作,被问了2次java垃圾回收机制,答的都不是很好!原先那股刨根问地的劲好像随着年龄的增长也越来越不行了!

 

以下是thinking in java中关于垃圾回收的一些总结:
java垃圾回收,主要是靠一个低优先级的进程负责回收,注意,不是后台的进程
他的优点是边回收,边调整堆使其紧凑


主要有以下几种算法:

1.引用计数
该算法在java虚拟机没被使用过,主要是循环引用问题,因为计数并不记录谁指向他,无法发现这些交互自引用对象。
怎么计数?
当引用连接到对象时,对象计数加1
当引用离开作用域或被置为null时减1
怎么回收?
遍历对象列表,计数为0就释放
有什么问题?
循环引用问题。

 

2.标记算法

标记算法的思想是从堆栈和静态存储区的对象开始,遍历所有引用,标记活得对象

对于标记后有两种处理方式

(1)停止-复制

所谓停止,就是停止在运行的程序,进行垃圾回收

所谓复制,就是将活得对象复制到另外一个堆上,以使内存更紧凑

优点在于,当大块内存释放时,有利于整个内存的重分配

有什么问题?

一、停止,干扰程序的正常运行,二,复制,明显耗费大量时间,三,如果程序比较稳定,垃圾比较少,那么每次重新复制量是非常大的,非常不合算

什么时候启动停止-复制?

内存数量较低时,具体多低我也不知道

(2)清除

也称标记-清除算法

也就是将标记为非活得对象释放,也必须暂停程序运行

优点就是在程序比较稳定,垃圾比较少的时候,速度比较快

有什么问题?

很显然停止程序运行是一个问题,只清除也会造成很对内存碎片。

为什么这2个算法都要暂停程序运行?

这是因为,如果不暂停,刚才的标记会被运行的程序弄乱,

(3)分代收集

分代收集是利用程序有大量临时对象的特点,对象每被引用一次,代数就增加,代数小的小型对象会被回收整理,大对象只会代数增加,不会被整理。

优点在于对于处理大量临时的变量很有帮助

(4)自适应

jvm会监测垃圾回收的效率,在(1),(2)算法之间切换。

 

3.增量收集,

增量回收的主要算法还是分代(Young Objects 回收)与Train算法(Mature Object回收),所谓增量回收的关键问题是如何实现有序的增量回收而不会导致混乱(引用及其的增加与减少),分代可以逐代回收,Train算法可以逐个车厢回收,这样每次一代或每次一厢可以实现短停顿回收。

具体算法可以参见以下文章:

Java HotSpot性能引擎的体系结构

http://blog.csdn.net/youlin/archive/2004/06/30/30574.aspx

 Java theory and practice: Garbage collection in the HotSpot JVM

http://www.ibm.com/developerworks/java/library/j-jtp11253/

Incremental collection of mature objects (1992)

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.53.3883

Incremental Mature Garbage Collection Using the Train Algorithm

http://www.daimi.au.dk/~beta/Papers/Train/train.html

写得都非常棒

4.与垃圾回收相关的主要是System.gc()和finialize()方法。

5.还有一些jvm关于垃圾回收的调优或者回收算法选择可以去google一下

评论

相关推荐

    Java 垃圾回收小结(一)

    本文将对Java垃圾回收进行小结,探讨其基本原理、类型以及常见算法。 1. 基本原理: Java中的内存分为堆(Heap)和栈(Stack)两部分,垃圾回收主要关注堆内存。当一个对象不再被任何引用指向时,它被视为可回收的...

    Java个人学习小结

    - **垃圾回收机制**: Java 内置了垃圾回收机制,自动管理内存资源,避免了内存泄漏等问题。 #### Java 运行原理 Java 语言同时具备编译型和解释型的特点: - **编译过程**: `.java` 源文件通过 `javac.exe` 编译...

    JAVA IO流小结

    JAVA IO流小结 JAVA IO流是指Java语言中用来实现输入/输出操作的机制。IO流是指任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象。他屏蔽了实际的I/O设备处理数据的细节。 一、流的定义和分类 流是...

    Java基础知识小结

    - **垃圾回收优化**:改进了垃圾回收机制,减少了暂停时间和内存占用。 - **并发性能提升**:增强了并发工具库,如`java.util.concurrent`包中的类,提高了多线程应用的性能。 - **文件I/O改进**:优化了文件读写...

    大话Java性能优化

    前言 第1章 性能调优策略概述 ...7.3 垃圾回收机制相关 7.4 实用JVM实验 7.5 本章小结 第8章 其他优化建议 8.1 Java现有机制及未来发展 8.2 系统架构优化建议 8.3 与编程无关 8.4 本章小结

    java基础小结

    - **自动内存管理**:Java使用垃圾回收机制(Garbage Collection)自动管理内存,程序员无需手动释放内存,降低了内存泄漏的风险。 - **异常处理**:Java通过try-catch-finally语句块进行异常处理,确保程序在遇到...

    关于static的小结(Java内存溢出)

    这意味着它们不受垃圾回收机制的影响,一旦分配则一直存在直到程序结束。如果程序中有大量的静态变量或者它们占用的空间很大,则可能引发方法区空间不足的问题,最终导致内存溢出。 2. **对象引用**:静态变量可以...

    java/c++区别

    2) **JAVA的新特性**:Java引入了垃圾回收机制,自动管理内存,简化了程序员的工作;并且提供了强类型检查和异常处理机制。 3) **两者共有的特性**:Java和C++都是面向对象的,都支持继承、封装和多态,但Java的实现...

    java个人总结,觉得还不错

    Java的垃圾回收机制主要包括以下几个方面: - **标记-清除算法**:最基础的垃圾回收算法,分为“标记”和“清除”两个阶段。 - **复制算法**:将内存分为大小相等的两块,每次只使用其中一块,在垃圾回收时将存活的...

    学习上的一些小结,主要是java和C#等

    在Java中,类是对象的蓝图,通过接口实现多继承,而异常处理和垃圾回收机制则提供了强大的错误处理和内存管理能力。 C#,由微软公司开发,主要用于.NET框架,同样是一种面向对象的语言,但更专注于Windows环境。C#...

    Java(J2SE、J2EE)学习小结

    7. 垃圾回收机制:Java的垃圾回收自动管理内存,避免了程序员手动释放内存的麻烦。优化GC包括减少内存消耗、合理使用引用类型、避免全局大对象等。 8. 浮点型精度:Java中的`float`型精度有限,不能精确表示3.4,...

    Java内存分配、管理小结.doc

    - 分配内存时,如果堆空间不足,会触发垃圾回收,清理不再使用的对象,释放空间。 4. **本地方法栈(Native Method Stack)**: - 本地方法栈与Java栈类似,但它是为Java虚拟机执行本地(非Java)方法服务的。 5...

    java笔试题小结

    ### Java笔试题小结 #### 1. Java 字符串(String) **问题**: String 类的特点是什么?与 StringBuffer 的区别? **分析与解答**: `String` 类在 Java 中是不可变的,即一旦创建了一个字符串对象,其内容就不能...

    毕向东Java笔记

    - **高性能**:通过JIT(Just-In-Time)编译器和先进的垃圾回收机制提高性能。 - **分布式**:Java内置对网络的支持,方便开发分布式应用。 - **动态性**:Java具有良好的动态性,能够适应不断变化的环境。 - **...

    疯狂JAVA讲义

    1.7 垃圾回收机制 20 1.8 何时开始使用IDE工具 21 学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 ...

    java面试题目精选

    - **理解垃圾回收**:介绍了Java中的自动内存管理和垃圾回收机制。 - **初始器**:讲解了Java中用于初始化对象的构造函数和初始化块。 - **9.1 Java的多线程机制** - **进程与线程的区别**:解释了进程和线程的...

    Java面向对象教程

    理解内存分配和垃圾回收机制对于避免内存泄漏和提高程序性能至关重要。 6. 异常处理:Java提供了一套异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。这有助于保持程序的健壮性,确保即使在发生...

Global site tag (gtag.js) - Google Analytics