`
- 浏览:
220406 次
- 性别:
- 来自:
深圳
-
JVM的一个关键特征是它的GC Heap。Heap保存了Java运行期的所有对象,数组。GC可以动态释放Heap中不再使用的空间。在Java程序里,一个对象可以通过关键字new来创建,“创建”对于JVM来说就是在Heap里分配一块空间保存新对象。GC,也就是Garbage collection,既清除Heap里不再使用的对象。为了清除这些对象,GC必须调用这些对象的Finalizer。另为GC还可以合并Heap中的空间碎片。Heap空间碎片是由于不断分配和释放造成的。如果不合并这些碎片,即使有足够的空间,由于没有足够大的连续空间而不得不扩大Heap空间,扩大空间会降低运行性能。
GC算法
目前已经实现了很多GC算法,处理Sun之外,IBM,Symantec,Microsoft,HP,以及各种开源组织都投入到这项研究。那他们竞争的关键就在于GC的Heap。任何一个GC算法都必须做两件事,一,它必须能找到所有的垃圾对象,也就是不再使用的对象,二,它必须可以回收垃圾对象空间。
通常,搜索垃圾的工作,首先建立一组类似于树的结构,树根为root,节点则叫做对象引用。任何一个对象如果在各种结构里能找到它的引用,则成为该对象可使用(reachable)或称对象状态是活动的(live),而任何没有在结构里找到引用的对象则称为垃圾。在JVM里,所有的对象都保存在Heap里,本地变量则保存在Java Stack里,每个线程都有自己的Stack。每个本地变量或是对象引用,或是基本数据类型,例如int, char或float。因此,线程里保存的只是对象的引用,而对象的实例都保存在Heap中。当一个线程结束,线程里对象引用将被删除,那么这些对象就有可能成为Heap中的垃圾。(“有可能”是因为对象有可能在其他线程中被引用。)
区别可使用对象和垃圾对象有两种方法,他们是引用计数和遍历搜索。引用计数就是在Heap中记录各个对象的引用数。遍历搜索是在树结构里搜索对象引用,并在Heap里标记被引用的对象,遍历后,那些没有标记的对象则是垃圾。
引用计数器
引用计数器保存在对象里,当一个对象被创建时,计数器为1。当其他对象引用这个对象时,该对象的引用计数器加1。当对这个对象的引用结束时,计数器减1。引用计数器为0时,则被看作是垃圾。该算法的缺点是没有遍历功能。该算法已经过时,现在的JVM都采用第二种方法遍历搜索法。
遍历搜索器
搜索器从树结构的根节点开始遍历,寻找对象引用,并把被引用的对象做标记(Mark)。遍历之后,未作标记的对象被视为垃圾,可被GC回收(Sweep)。
碎片整理器
Heap碎片整理(Compacting collector)有两个步骤,整理和拷贝。这两步用来移动Heap中的对象从而减少碎片。既然好移动对象的位置,当要也要更新对象的引用,但是更新对象引用是会降低VM的性能,因此建立一个对象句柄表,对象引用指向对象句柄,当对象移动时,更新对象的句柄,而不用改变对象引用的值。拷贝步骤就是将Heap的对象移动到新的位置。为了提高拷贝的性能,VM被分为两个区,VM在内只能使用两个中的一个。当使用中的区没有空间后,将所有的对象从该空间拷贝到另一个空间,并继续在另一个空间工作,直到另一个空间满了为止,再把所有对象拷贝回原来的空间。该方法的代价就是需要花费2倍的空间。
source:
http://developer.51cto.com/art/200607/29155.htm
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
在JVM GC原理和heapsize调优的学习和实践过程中,需要理解多个关键概念和操作步骤,下面详细展开: 1. 垃圾回收机制的理解 在Java中,当对象不再被引用时,它们应该被垃圾回收器回收。GC机制基于几个关键概念工作,...
JVM(Java Virtual Machine)的垃圾收集器(GC,Garbage Collector)扮演着核心角色,负责自动管理应用程序的内存,防止内存泄漏和性能问题。MAT(Memory Analyzer Tool)是由Eclipse基金会提供的一个强大的分析工具...
首先,我们需要了解JVM内存的几个主要区域:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。GC主要关注堆和方法区,尤其是堆中的新生代和老年代...
2. **内存模型**:JVM的内存分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。书中会详细解析各区域的功能、分配规则以及它们之间的...
- **对象分配**:在IBM JVM中,对象的分配主要是在堆内存(Heap)中进行的。对象创建时会为其分配足够的内存空间。 - **可达性分析**:IBM JVM通过追踪对象间的引用关系来判断一个对象是否仍然被引用,从而确定其...
### JVM_GC_调优总结 #### 一、GC(Garbage Collection)概述 **1.1 GC的概念** - **定义**: GC(Garbage Collection),即垃圾收集器,用于跟踪内存中的对象,并自动回收那些不再被其他对象引用的对象,释放这...
### JVM_GC调优详解 #### 一、JVM体系结构概览 Java虚拟机(JVM)作为Java程序的运行环境,其内部结构复杂且高效。为了更好地理解JVM_GC调优,我们首先来了解一下JVM的基本组成部分。 1. **类装载器子系统(Class ...
1. **内存模型**:JVM内存分为堆内存(Heap)、方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)和程序计数器(PC Register)。其中,堆和方法区是线程共享的,而栈和程序计数器是...
JVM内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)五大部分。 - **堆**:所有对象实例都在堆中创建,是JVM中最大的...
垃圾收集(Garbage Collection, GC)是JVM内存管理的重要组成部分,它负责自动回收不再使用的对象所占用的内存。GC算法主要有以下几种: 1. **标记-清除(Mark-Sweep)**:标记所有活动对象,然后清除所有未标记的...
本教程——“深入JVM内核—原理、诊断与优化视频教程”着重讲解了JVM的内部机制,特别是关于垃圾收集(Garbage Collection, GC)的算法和种类,这对于理解和提升Java应用性能至关重要。 一、JVM内存模型 首先,...
在Java开发中,JVM(Java虚拟机)的性能优化是一项关键任务,特别是对于大型系统而言,频繁的Full GC(垃圾收集)会导致应用暂停时间过长,影响用户体验。本资料"jvm-full-gc调优-jvm-full-gc.zip"显然是针对如何...
1. **堆内存(Heap)**:这是JVM中最大的内存区域,用于存储对象实例。堆内存被所有线程共享,并且在JVM启动时创建。对象的分配和垃圾回收主要在堆上进行。 2. **年轻代(Young Generation)**:年轻代分为Eden区和...
- **堆(Heap)**:所有对象实例和数组的存储区域,是GC的主要工作区域。 - **程序计数器(Program Counter Register)**:记录当前线程执行的字节码指令地址。 - **执行引擎(Execution Engine)**:负责解释和...
《JVM Full GC 之 MAT 工具分析实践》 在Java开发中,理解JVM内存管理和垃圾收集机制至关重要,因为这直接关系到应用程序的性能和稳定性。当遇到内存溢出(OutOfMemoryError)、系统异常或者性能下降等问题时,我们...
JVM内存主要分为堆内存(Heap)和非堆内存(Non-Heap)两大部分。堆内存又细分为新生代(Young Generation)、老年代(Tenured Generation或Old Generation)以及持久代(Permanent Generation或Metaspace)。新生代...
《JVM性能调优——JVM内存整理及GC回收》是针对Java开发人员的重要主题,尤其是在大型企业级应用中,确保JVM(Java虚拟机)的高效运行是至关重要的。本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来...
在讨论Java垃圾回收机制时,我们需要了解JVM(Java虚拟机)中的堆内存结构以及垃圾回收(GC)的工作原理。堆内存是JVM管理的内存区域之一,用于存放对象实例。堆内存被分为几个不同的区域,包括年轻代(Young ...
【摩根面试宝典-JVM,GC,Spring etc.】主要涵盖了Java开发中的一些核心知识点,包括JVM架构、内存管理、线程同步以及Spring框架的相关内容。以下是对这些知识点的详细阐述: 1. **JVM架构** - **类装载器(Class ...