`
zxy861114
  • 浏览: 4086 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

浅谈java垃圾回收

阅读更多
很多天之前就想总结一下java垃圾回收的机制了,一直因为自己懒,没有付诸行动。今天终于决定凭自己的记忆与理解稍微理一下。

   前备知识:JVM分为两个子系统(类装载器、执行引擎)和两个组件(运行时数据区、本地接口组件)。组件运行时数据区包含有:方法区、堆、java栈、本地方法栈、PC。而java执行过程经历过解释执行、JIT以及自适应编译三个阶段。Sun的Hotspot属于自适应编译过程,遵循2/8原则.在它的垃圾回收机制中,实行按代收集的策略,将内存分为年青代,年老代,持久代.年青代和年老代属于堆,而持久代属于方法区.

  好了,如果你已经了解了前备知识,那么就看看我们应该怎样去进行垃圾回收.

  无论何种垃圾回收机制的任务都是完成下面两个任务:一,识别查找无用的资源对象.二.清除释放无用资源.如何知道资源对象为垃圾是一个重点.以下提供了一些常用方法.

  引用计数:这个是人们最原始的想法,在对象中维持一个计数器,有一个对象引用时就加1,无用时就减1,当为0时就可以被垃圾回收器清除了.

  追踪标记:从根结点开始遍历,能够遍历到的标记,最后将没有标记的清除.

  压缩:从根起将可触及的对象放入内存的一边.移动时就完成了可触及的检测与清除无用资源.

  拷贝:将空间内存划分为相同两块,生成的对象在其中一个中,满时即从根起可触及的对象放入另一块中.

  按代收集器:将要收集的垃圾分成几代,按照拷贝的思想去组织,这种优点明显:可规定块的大小,从而大约每次执行时间,从而控制延迟.让用户感觉不到垃圾收集的过程,从而获得良好的用户体验.也可用于实时控制中.

  前面提到了,Sun的hotspot技术中使用的是按代收集的策略.将内存分为年青代,年老代,持久代.年青代和年老代属于堆,而持久代属于方法区.现在我们来稍微扩展的来讲一下:

    年青区分为Eden、两个对称的Survivor spaces.新生的对象在Eden中生成,当Eden满时即向其中一个Survivor转移。到其中一个Survivor满时向另一个Survivor转移。当都满时向年老代转移。这里需要注意,其实Survivor任何时候都有一个为空。

  那年老代是无法规定其大小的,因为任何资源对象总要有一个去处,那如何保证它在有限的时间内执行完了。这里不得不提火车车厢算法。将年老代中的内存看成多辆火车,火车由多节车厢组成。对火车和车厢都进行编号。每次检测时首先检测最小号的火车,看外部是否有引用指向它,如果没有,则是垃圾。如果有,则检测最小号火车的最小号车厢。如果有引用,引用来自年老代之外,将引用对象资源放入本列火车的尾部。如果来自其它火车,则将引用对象资源放入引用它的其它火车车厢,如果来自本列火车的其它车厢,则将引用资源放入本列火车的其它车厢,最后本节最小号车厢剩下的即是垃圾。

  讲到这里,前面提到过几次可触及这个名词。那么它是如何分类的呢,从强到弱有:强可触及状态,软可触及状态(SoftReference)、弱可触及对象(WeakReference)、可复活状态、影子可触及状态(PhantomReference),不可触及状态。从根部开始遍历这个图去区分,具体如何区别这里不谈。但我们谈一下,那到底这些根有哪些呢,具体的实现可能不同,但一定包括以下部分:在java栈栈桢中的局部变量、方法区中一些常量字符(如方法名).

  不知不觉已经写了这么多啦,里面很多都没有太展开去讲,但如果能够看明白,于理解垃圾回收应该问题不大。
0
1
分享到:
评论
1 楼 msnvip 2010-06-10  
  拷贝:将空间内存划分为相同两块,生成的在对象在其中一个中,满时即从根起可触及的对象放入另一块中.


这句话.咋这么纠结

相关推荐

    浅谈JAVA垃圾回收机制.pdf

    浅谈 JAVA 垃圾回收机制 Java 垃圾回收机制是 Java 语言中的一种自动内存管理机制,它可以自动回收内存中的垃圾,避免代码运行时由于忘记释放对象而带来的内存泄漏问题。 Java 中的垃圾回收机制主要通过两种算法来...

    浅谈Java垃圾回收的实现过程

    Java垃圾回收的实现过程 Java垃圾回收是一种自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM解除了程序员在程序中分配和释放内存资源的开销。启动Java垃圾回收作为一个自动的过程,程序员...

    关于javal垃圾回收机制的一些文档

    浅谈Java垃圾回收机制.doc文档可能会涵盖以下几个关键点: 1. **对象生命周期**:当一个对象被创建后,它会在内存中占据一定的空间。如果对象不再被任何引用指向,那么这个对象就成为垃圾。 2. **垃圾收集器**:...

    浅谈Java语言评价胜出的8大技术优势

    ### 浅谈Java语言评价胜出的8大技术优势 #### 1. 强大的API支持 Java提供了非常丰富的API支持,包括网络编程中的Socket API、数据库操作中的SQL API、图形用户界面的Swing和AWT API等。这些API不仅功能强大而且...

    浅谈java集合框架

    ### 浅谈Java集合框架 Java集合框架是一个用于存储、操作和检索一组对象的强大工具集。集合框架的设计目的是为了提供一套高效且灵活的数据结构来满足不同的应用需求。本篇文章将详细探讨Java集合框架中的一些核心...

    浅谈Java堆外内存之突破JVM枷锁

    浅谈Java堆外内存之突破JVM枷锁 本文主要介绍了Java堆外内存的概念,包括JVM内存分配、JVM垃圾回收、堆外内存的垃圾回收等相关内容。Java开发者都知道,Java中不需要手动申请和释放内存,JVM会自动进行垃圾回收;而...

    java培训教程-浅谈java虚拟机.pdf

    4. **无用单元收集堆(Garbage-collected heap)**:Java对象在堆内存中分配,JVM负责自动管理内存,包括对象的创建和销毁,通过无用单元收集(Garbage Collection)机制来回收不再使用的内存,避免内存泄露。...

    浅谈Java中的变量.pdf

    Java的垃圾回收机制负责清理不再使用的对象,因此实例变量的生存期可能因多个引用的存在而延长。 5. **Java虚拟机中的内存布局**: JVM在运行时将内存划分为不同的区域,如程序计数器、Java堆、栈、方法区和本地...

    浅谈JAVA软件开发的几大误区.pdf

    有些开发者认为Java天生慢,但实际上,Java虚拟机(JVM)提供了高效的内存管理和垃圾回收机制。通过合理的内存管理、算法优化以及使用并发处理,可以实现高性能的Java应用。同时,过度优化也可能导致代码可读性和可...

    浅谈Java回收对象的标记和对象的二次标记过程

    Java垃圾回收机制是Java语言的一大特性,它负责自动管理程序中的内存,避免程序员手动处理内存分配和释放。本文主要探讨的是对象的标记和二次标记过程,这是垃圾收集器确定对象是否可回收的关键步骤。 一、对象的...

    浅谈关于C#的垃圾回收机制

    理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理、程序集加载、安全性、异步处理和线程同步。 CTS(Common Type ...

    浅谈关于Java的GC垃圾回收器的一些基本概念

    Java的垃圾回收(GC)是Java虚拟机(JVM)管理内存的重要机制,它自动识别并清理不再使用的对象,以防止内存泄漏。本文主要探讨Java GC的基本概念,涉及JVM内存模型以及不同的垃圾回收算法。 首先,让我们了解几种...

    浅谈Java引用和Threadlocal的那些事

    浅谈Java引用和Threadlocal的那些事 本文主要介绍了Java引用和Threadlocal的知识点,包括Java中的引用类型、Threadlocal的使用等。 Java中的引用类型: Java中有四种引用类型:强引用(Strong Reference)、软...

    浅谈Java程序运行机制及错误分析

    浅谈Java程序运行机制及错误分析 Java程序运行机制是指Java虚拟机(JVM)的运行机制和Java程序的执行过程。Java虚拟机是可运行Java代码的假想计算机,以实现Java语言的跨平台特性。Java程序的运行需要经过编写、...

    浅谈jvm中的垃圾回收策略

    Java虚拟机(JVM)中的垃圾回收(Garbage Collection, GC)是自动内存管理的关键机制,它负责识别并清理不再使用的对象,以便回收内存资源。本文将深入探讨JVM的垃圾回收策略,尤其是基于分代的内存回收算法。 在...

    浅谈java是如何做资源回收补救的

    `finalize`是Java中一个特殊的方法,它会在垃圾收集器准备回收一个对象时被调用。设计此方法的初衷是为对象提供最后一次清理的机会。例如,当一个`FileInputStream`对象不再被引用时,如果其`close`方法没有被显式...

    浅谈jvm原理

    "浅谈 JVM 原理" JVM(Java Virtual Machine)是一种虚拟机,它可以模拟完整的硬件系统功能,运行在一个完全隔离的环境中,提供了一个完整的计算机系统。JVM 可以分为三类:VMWare、Visual Box 和 JVM。其中,...

    浅谈Java 中的引用类型

    强引用可以保护对象不被垃圾回收器回收,只要对象还有强引用存在,垃圾回收器就不会回收它。 软引用 软引用是一种特殊的引用类型,它用来描述一些还有用但非必需的对象。在内存即将发生内存溢出之前,会把这些对象...

Global site tag (gtag.js) - Google Analytics