1.概要
在《深入理解Java虚拟机》学习小记一之自动内存管理机制(一)中,我们罗列了以下几个问题:
-
什么操作可能导致内存溢出?
-
有哪些种类的内存溢出?
-
都是在内存的哪些区域溢出?
-
垃圾收集有哪些原则?
-
有哪些垃圾收集算法及其实现?
-
新生代和老年代的回收策略如何?
-
各种内存相关的JVM参数是什么意思?
本文主要总结问题4、问题5和问题7.总体如下:
2.判断对象是否存活的算法
常用的判断对象是否存活的算法有两种:一种是引用计数算法,另外一种是根搜索算法。例如Python语言就是使用了引用计数算法进行内存管理的。Java、C#和古老的Lisp等语言使用了根搜索算法判断对象是否存活。下面就算法的思想上介绍这两种算法。
2.1引用计数算法
引用计数算法最主要的步骤如下描述:
-
给对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1
-
当引用失效时,计数器值就减1
-
当计数器的值为0时,就判断该对象不能被使用
这个算法实现简单,但是很难解决对象之间循环引用的问题,因此Java并没有使用这种算法来管理内存。
2.2根搜索算法
根搜索算法是通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
3.GC算法
3.1标记-清除(Mark-Sweep)算法
算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。算法示意图如下:
该算法是最基础的收集算法,后续的搜集算法都是基于这种思路并对其缺点进行改进得到的。
3.2复制(Copying)算法
为了解决效率问题,复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一快。当这块的内存用完了,就讲还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。算法示意图如下:
现在的商业虚拟机都采用这种收集算法来回收新生代。
3.3标记-整理(Mark-Compact)算法
复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会很低。因此在老年代一般不能直接使用这种算法。
为了解决这个问题,标记-整理算法为此诞生。该算法标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存,算法示意图如下:
3.4分代收集算法
当前商业虚拟机的垃圾收集都采用分代收集算法,该算法只是根据对象的存活周期不同将内存划分为几块。一般将Java堆划分为新生代和老年代。新生代一般采用复制算法,老年代一般采用标记-清除算法或标记-整理算法。
3.5几种算法的优缺点
4.垃圾收集器
关于垃圾收集器的知识在这里不做介绍,有兴趣的可以参考http://book.51cto.com/art/201107/278913.htm
5.垃圾收集器的参数总结
6.关于GC的几点补充
经过上述的说明,可以发现垃圾回收有以下的几个特点: 1.垃圾收集发生的不可预知性:由于实现了不同的垃圾收集算法和采用了不同的收集机制,所以它有可能是定时发生,有可能是当出现系统空闲CPU资源时发生,也有可能是和原始的垃圾收集一样,等到内存消耗出现极限时发生,这与垃圾收集器的选择和具体的设置都有关系。 2.垃圾收集的精确性:主要包括2 个方面:
a.垃圾收集器能够精确标记活着的对象;
b.垃圾收集器能够精确地定位对象之间的引用关系。
前者是完全地回收所有废弃对象的前提,否则就可能造成内存泄漏。而后者则是实现归并和复制等算法的必要条件。所有不可达对象都能够可靠地得到回收,所有对象都能够重新分配,允许对象的复制和对象内存的缩并,这样就有效地防止内存的支离破碎。
3.现在有许多种不同的垃圾收集器,每种有其算法且其表现各异,既有当垃圾收集开始时就停止应用程序的运行,又有当垃圾收集开始时也允许应用程序的线程运行,还有在同一时间垃圾收集多线程运行。 4.垃圾收集的实现和具体的JVM 以及JVM的内存模型有非常紧密的关系。不同的JVM 可能采用不同的垃圾收集,而JVM 的内存模型决定着该JVM可以采用哪些类型垃圾收集。现在,HotSpot 系列JVM中的内存系统都采用先进的面向对象的框架设计,这使得该系列JVM都可以采用最先进的垃圾收集。 5.随着技术的发展,现代垃圾收集技术提供许多可选的垃圾收集器,而且在配置每种收集器的时候又可以设置不同的参数,这就使得根据不同的应用环境获得最优的应用性能成为可能。 针对以上特点,我们在使用的时候要注意: 1.不要试图去假定垃圾收集发生的时间,这一切都是未知的。比如,方法中的一个临时对象在方法调用完毕后就变成了无用对象,这个时候它的内存就可以被释放。 2.Java中提供了一些和垃圾收集打交道的类,而且提供了一种强行执行垃圾收集的方法--调用System.gc(),但这同样是个不确定的方法。Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。 3.挑选适合自己的垃圾收集器。一般来说,如果系统没有特殊和苛刻的性能要求,可以采用JVM的缺省选项。否则可以考虑使用有针对性的垃圾收集器,比如增量收集器就比较适合实时性要求较高的系统之中。系统具有较高的配置,有比较多的闲置资源,可以考虑使用并行标记/清除收集器。 4.关键的也是难把握的问题是内存泄漏。良好的编程习惯和严谨的编程态度永远是最重要的,不要让自己的一个小错误导致内存出现大漏洞。 5.尽早释放无用对象的引用。大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null,暗示垃圾收集器来收集该对象,还必须注意该引用的对象是否被监听,如果有,则要去掉监听器,然后再赋空值。 --------------------------------------------------全文完---------------------------------------
分享到:
相关推荐
Java虚拟机(JVM)的内存管理机制是Java编程中至关重要的部分,它涉及到程序的性能和稳定性。本文主要分析了Java虚拟机的内存管理,特别是垃圾回收机制及其实现。 首先,Java虚拟机中的内存主要分为堆内存和栈内存...
Java虚拟机内存管理总结 Java虚拟机(JVM)中的内存管理是指Java语言中对象的分配和释放问题。Java中的内存管理可以分为两部分:对象的分配和释放。 对象的分配是由程序完成的,程序员需要通过关键字new为每个对象...
本文档旨在对Sun J2SE 5.0版本中的Java HotSpot虚拟机(JVM)内存管理机制进行全面概述,包括不同类型的内存收集器及其配置方法、如何调整收集器内存区域的大小等。此外,还将提供一些影响内存收集器行为的常见选项,...
- **垃圾收集(Garbage Collection, GC)**:自动内存管理,清理不再使用的对象,防止内存泄漏。包括新生代GC(Minor GC)、老年代GC(Major GC)和全GC(Full GC)。 - **内存溢出与内存泄漏**:当内存耗尽或无法...
例如,对JVM的垃圾回收算法的了解,有助于开发者编写出更适合自动内存管理的代码。了解JVM的线程模型,有助于编写高性能的多线程程序。 JVM规范是不断发展的,随着Java技术的发展,它也在不断地进行改进和扩展。...
- 堆内存是所有线程共享的,由Java虚拟机自动管理。 - 堆内存的大小可以通过JVM参数来设置,如`-Xms`和`-Xmx`来指定初始大小和最大限制。 3. **数据段(Data Segment)**: - 包括静态域和常量池两部分。 - **...
此外,JVM还实现了垃圾回收机制,自动管理内存,避免了程序员手动管理内存的麻烦。 JVM还有许多优化技术,如分代垃圾收集、并行/并发GC、压缩引用、逃逸分析等,这些都对提升Java应用的性能起到了关键作用。对于...
3. **垃圾收集与内存管理**:JVM负责自动管理内存,包括对象的分配和回收。垃圾收集器是其重要组成部分,通过标记-清除、复制、标记-整理和分代收集等多种算法来释放不再使用的内存。 4. **类加载过程**:类的生命...
垃圾收集自动管理内存,避免程序员手动处理内存泄露问题;JIT编译则是在运行过程中将频繁执行的热点代码编译成本地机器码,提升运行效率。 总的来说,Java虚拟机是Java生态系统中的关键组件,它使得Java程序能够在...
3. **垃圾收集与内存管理**:Java虚拟机中的垃圾收集机制是自动进行内存管理的关键。书里介绍了不同的垃圾收集算法(如标记-清除、复制、标记-整理、分代收集等)以及垃圾收集器(如Serial、ParNew、CMS、G1等),...
JAVA虚拟机的内存分配与回收机制是JAVA语言的核心机制之一,栈和堆是JAVA用于在RAM中存放数据的地方,JAVA自动管理栈和堆,程序员不能直接地设置栈或堆。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小...
JAVA虚拟机内存分配机制是Java程序执行过程中内存管理的核心部分,它涉及到程序的性能和效率。Java虚拟机(JVM)内存主要分为两大部分:栈内存和堆内存。 栈内存主要存储程序运行过程中的局部变量,包括基本类型...
同时,ART也提供了垃圾回收和内存管理机制,有助于提高应用的稳定性和效率。 3. **JAVA虚拟机的执行过程** 在Android中,Java源代码首先通过编译器生成.class文件,然后通过dx工具转换为.dex文件。在设备上,ART会...
此外,JVM的垃圾收集机制是其内存管理的关键,它自动回收不再使用的对象,避免内存泄漏。 为了更好地理解和分析JVM行为,开发者通常会借助各种工具,如VisualVM、JProfiler和JConsole等。这些工具可以实时监控JVM的...
2. **内存保护**:通过内存管理机制,JVM可以防止程序访问非法内存区域,避免内存泄漏和其他内存相关的问题。 3. **数据流分析**:字节码验证器会进行数据流分析,确保所有变量在使用前已经被正确初始化。 4. **...
它详细阐述了Java虚拟机(JVM)的工作原理,包括内存管理、类加载机制、字节码执行以及垃圾回收等核心概念。深入理解这些知识点对于提升程序性能、解决运行时问题以及设计高效的应用程序至关重要。 1. **JVM架构** ...
4. 内存管理:主要涉及垃圾收集机制,自动回收不再使用的对象,避免内存泄漏。现代JVM使用多种垃圾收集算法,如标记-清除、复制、标记-整理和分代收集等。 5. 本地方法接口:允许JVM调用原生的C/C++代码,实现与...
Java语言丰富的类库支持、自动内存管理和跨平台执行能力是其显著的优势,使得Java语言在互联网、企业网和嵌入式设备等领域广泛应用。JVM通过其解释执行机制和即时编译技术,使得Java程序具备了良好的平台无关性和...