在Java 中gc是不被强制要求的,因此,各个厂商生产的 JVM 的性能如何,就极大的取决于gc的设计方案和实现原理。
在早期的 JVM 中,gc 在进行垃圾收集时,采用“引用计数法”,他的特点是通过记录对象被引用的次数来决定该对象是否应该标记为“垃圾收集状态”。如果某个对象,他的被引用数为“0”,则该对象会被标记为“垃圾收集状态”,在JVM 处于无操作状态时,由 gc 进行垃圾收集工作将其所占内存空间进行回收再利用。
现在的 JVM 大多采用“对象引用遍历法”,在遍历时,以某些对象为根构成一个有向图进行遍历。沿着有向图上的每条链路进行递归遍历,如果在遍历的过程中发现有这样一个对象,至少有一个根对象无法遍历到这个对象,那么不管其他根对象是否能够遍历到该对象,都将其标记为“垃圾回收状态”。
尽管各个厂商在具体实现的细节上有各种各样的差异,但是,就从大的思路上来说,基本上都是一致的,也就是说,先对要回收的对象进行标记,然后再进行回收。
说到垃圾回收,自然就少不了垃圾回收的相关技术。下面我就是一些基本的实现机制:
² 标记-清除收集器
² 标记-压缩收集器
² 复制收集器
² 增量收集器
² 分代收集器
² 并发收集器
² 并行收集器
在 Sun 的HotSpot 1.4.1中,它使用“分代收集器”把“堆”分为:新域、旧域以及永久域等三个主要的域。
对象在刚刚生成时会进入“新域”,在经过若干次的垃圾收集后,如果此对象仍然没有被标记为“垃圾回收状态”就会进入“旧域”,但这只是一个理论情况,实际情况是,有些“旧对象”仍然会留在新域中。而“永久域”作为一个独立的域通常不被认为是堆的一部分,他主要用来存放类和方法的框架结构。永久域默认大小为4m。运行程序时,JVM 会自动调整永久域的大小以满足需要。每次调整时,JVM 会对“堆”进行一次完全的垃圾收集。因此,虽然我们无法确切知道JVM在什么时候进行垃圾回收,但是有一点是确定的,那就是,如果用户在短时间内访问和调用大量的类及其方法时,JVM一定会进行垃圾收集工作。
默认状态下,HotSpot在新域中使用复制收集器。该域一般分为三个部分。第一部分为Eden,用于生成新的对象。另两部分称为救助空间,当Eden充满时,收集器停止应用程序,把所有可到达对象复制到当前的from救助空间,一旦当前的from救助空间充满,收集器则把可到达对象复制到当前的to救助空间。From和to救助空间互换角色。维持活动的对象将在救助空间不断复制,直到它们获得使用期并转入旧域。
因为应用程序生成的大部分对象是短寿命的。理想状态下,所有过渡对象在移出Eden空间时将被收集。如果能够这样的话,并且移出Eden空间的对象是长寿命的,那么理论上可以立即把它们移进旧域,避免在救助空间反复复制。但是,应用程序不能适合这种理想状态,因为它们有一小部分“中长寿命”的对象。最好是保持这些“中长寿命”的对象并放在新域中,因为复制小部分的对象总比压缩旧域廉价。这也就是我在前面为什么说“旧对象”不一定会进入旧域中。
>>未完待续...
分享到:
相关推荐
Sun HotSpot 1.4.1 JVM使用分代垃圾收集器,将堆空间划分为三个主要部分: - **新生代(Young Generation)**:新创建的对象最初位于此区域。 - **老年代(Old Generation)**:经过一定次数GC后仍存活的对象将被移...
Sun HotSpot 1.4.1 JVM提供了丰富的配置选项来优化垃圾回收行为。例如: - 设置初始堆大小和最大堆大小: - `-Xms` 和 `-Xmx` 用于分别设置初始堆大小和最大堆大小。如 `-Xms128m -Xmx256m` 表示初始堆大小为128MB...
在Sun HotSpot 1.4.1 JVM中,堆内存被分为新域(Young Generation)、旧域(Tenured Generation)和永久域(Permanent Generation),每个域的大小可以通过JVM参数进行调整。例如,`-Xms`和`-Xmx`设置堆的初始和最大...
在具体实践中,例如Sun HotSpot 1.4.1 JVM,堆内存分为新域(年轻代)、旧域(老年代)和永久域(存放类和方法信息)。可以通过`-Xms`和`-Xmx`设置堆的初始和最大大小,`-XX:NewRatio`调整新旧域的比例,`-XX:...
本篇文章将深入解析JVM的垃圾回收机制,并针对Sun HotSpot 1.4.1版本的JVM,讨论如何调整堆内存的大小以优化GC性能。 首先,JVM的堆内存被划分为三个主要区域:新域(Young Generation)、旧域(Tenured Generation...
Sun HotSpot 1.4.1 JVM使用分代收集器,堆分为新域、旧域和永久域。新域存放新创建的对象,经过一定次数的GC循环后晋升至旧域,永久域存储类和方法对象。通过JVM参数如-Xms和-Xmx控制堆的总大小,-XX:NewRatio设定...
在Sun HotSpot 1.4.1 JVM中,可以通过参数调整堆的大小和其他配置。例如,使用`-Xms`和`-Xmx`分别设置堆的初始大小和最大大小。 - `-Xms128m`:设置初始堆大小为128MB。 - `-Xmx256m`:设置最大堆大小为256MB。 - `...
3.Sun HotSpot 1.4.1 JVM堆大小的调整 Sun HotSpot 1.4.1使用分代收集器,它把堆分为三个主要的域:新域、旧域以及永久域。Jvm生成的所有新对象放在新域中。一旦对象经历了一定数量的垃圾收集循环后,便获得使用...
- **Sun HotSpot 1.4.1**:使用分代收集器,堆分为新域、旧域和永久域。 - **堆大小控制**:通过`-Xms`和`-Xmx`设置堆的最小和最大大小。 - **新域比例控制**:`-XX:NewRatio`设置新域在堆中的比例,例如,新域与...
对于Sun HotSpot JVM 1.4.1,其采用了分代收集器,堆内存分为新域、旧域和永久域。新域用于存放新生对象,旧域容纳长期存活的对象,而永久域存储类和方法元数据。通过参数如`-Xms`、`-Xmx`控制堆总大小,`-XX:...
- **JVM堆大小调整**:提供Sun Hotspot JVM 1.4.1版本下调整堆大小的具体步骤,以优化性能。 - **获取JVM信息**:讲解如何从JVM中提取关键信息,如内存使用情况、GC行为等,以辅助调优决策。 #### WebLogic Server ...
1.4.1 Sun Classic Exact VM 1.4.2 Sun HotSpot VM 1.4.3 Sun Mobile-Embedded VM Meta-Circular VM 1.4.4 BEA JRockit IBM J9 VM 1.4.5 Azul VM BEA Liquid VM 1.4.6 Apache Harmony Google Android Dalvik ...
63.3. Sun HotSpot 1.4.1 JVM堆大小的调整 44 63.4. BEA JRockit JVM的使用 45 63.4.1. Bea JRockit JVM支持4种垃圾收集器: 46 63.5. 如何从JVM中获取信息来进行调整 46 63.6. Pdm系统JVM调整 47 63.6.1. 服务器:...
Java JRE(Java Runtime Environment)是Java应用程序的执行环境,它是Oracle公司(原Sun Microsystems)提供的,用于在计算机上运行Java程序所必需的软件组件。JRE1.4是Java平台的一个早期版本,发布于2004年,它...