名称 |
查找对象 |
垃圾回收 |
引用计数 |
存储引用数, |
引用数为0时收集 |
对象引用遍历(清除方式) |
递归遍历,标记可到达对象
|
扫描堆栈,删除未标记对象,释放内存 |
对象引用遍历(压缩方式) |
递归遍历,标记可到达对象
|
重新组织内存中的对象,并进行压缩。 |
GC回收常用算法:
GC回收常用方式:
方式名称 |
原理 |
特点 |
标记-清除收集器 |
递归遍历,标记可到达对象,删除未标记对象, |
单线程并停止其它操作 |
标记-压缩收集器 |
递归遍历,标记可到达对象,把标记对象复制到堆栈的新域中,以便压缩堆栈 |
停止其它操作 |
复制收集器 |
将堆栈分成两个域,常称为半空间,每次仅使用一半的空间,jvm生成的新对象放在另一半空间中.gc运行时,把可到达对象复制另一半空间中去,从而压缩了堆栈 |
短生存期的对象,持续复制长生存期的对象则导致效率降低。 |
增量收集器 |
把堆栈分成多个域,每次仅从一个域回收 |
会造成较小的程序中断 |
分代收集器 |
把堆栈分为两个或多个域,用以存放不同寿命的对象。Jvm生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象,将获得使用期并转入更长寿命的域中。 |
对不同的域使用不同的算法以优化性能 |
并发收集器 |
与应用程序同时运行 |
这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低 |
并行收集器 |
使用多线程并行执行垃圾回收工作 |
在多cpu机器上使用多线程技术可以显著的提高java应用程序的可扩展性 |
Sun HotSpot 1.4.1
使用分代收集器,整个堆分为新域(分为:Eden空间,救助空间(From空间,to空间)),旧域,永久域
堆大小:-Xms堆的初使大小,-Xmx堆的最大值
Eden(新域) |
From(新域:救助空间) |
to(新域:救助空间) |
旧域 |
永久域
|
新域:存放新对象,使用复制收集器
-Xmn:将NewSize和MaxNewSize设成一致
-XX:NewSize:设置新域的初使值
-XX:MaxNewSize:设置新域的最大值
-XX:SurvivorRatio:救助空间与Eden空间的比值
-XX:MaxTenuringThreshold=0控制救助空间的比例
旧域:存放长期对象,标记-压缩收集器
-XX:NewRatio设置新域和旧域在堆中所占的比例
永久域:存放class和method对象
-XX:PermSize
-XX:MaxPermSize
例子:
1)java -Xms512m -Xmx512m -XX:NewSize=64m -XX:MaxNewSize=128m -XX:MaxPermSize=64m -XX:SurvivorRation =2
说明:
-Xms512m -Xmx512mà堆内存初始为512M,最大值512M,
XX:NewSize=64m -XX:MaxNewSize=128mà新域的初始值为64M,最大值为128M
-XX:MaxPermSize=64mà永久域初始值4M(默认值),最大值64M
-XX:SurvivorRation =2à新域中两个救助空间和Eden空间的比例为:(1+1):2,所以每个救助空间占新域的1/4,即128/4=32M , Eden域占1/2,即64M
2)java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m -XX:SurvivorRation =8
说明:
-Xmn128mà新域的初始值和最大值均为128M
-XX:PermSize=32m -XX:MaxPermSize=64mà永久域初始值32M,最大值64M
新域中Eden空间为:128*8/10=102.4M,(from和to救助空间)分别为:128/10=12.8M
3)java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0 -XX:SurvivorRatio=50000
说明:
-Xss128Kà设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
-XX:NewRatioà设置新域和旧域的比例1:4,新域大小为3550/5=710M
-XX:MaxTenuringThresholdà此值为0时,在新域中不使用救助空间,这时需要把-XX:SurvivorRatio设置成最大值
相关推荐
本文将深入探讨Java中的垃圾收集机制,包括其工作原理、不同类型的垃圾收集器以及它们在实际应用中的使用。 Java语言的一大卖点是它提供了自动内存管理,这意味着程序员不需要手动分配和释放内存,从而减少了内存...
以下是对Java垃圾收集器的详细解析: 1. **工作原理**: - 垃圾收集器的目标是识别并回收那些不再被任何活跃部分引用的对象所占用的内存,从而释放资源,防止内存泄漏。 - 活跃部分指的是程序中正在执行的部分,...
总结来说,这篇毕业设计论文的外文翻译深入解析了Java垃圾收集器如何运作,以及它如何通过优化内存管理来提升程序性能。通过对Java堆的动态理解和垃圾收集器的智能操作,Java能够提供一种无需程序员手动管理内存的...
Java垃圾收集机制是Java开发中的核心概念,它关乎程序的性能和稳定性。深入理解这一机制对于优化应用程序至关重要。本文将详细解析Java虚拟机(JVM)中的垃圾收集工作原理、不同类型的垃圾收集器以及如何通过编程...
至于Java垃圾收集器,它是自动管理内存的关键,减少了手动内存管理可能导致的错误,如C++中的内存泄漏。Java的垃圾收集策略始于20世纪60年代,并在Smalltalk和Eiffel等语言中应用。所有垃圾收集器的目标都是找出不再...
### 基于实时性的Java虚拟机垃圾收集算法:深入解析与优化 #### 引言 垃圾收集(Garbage Collection, GC)是Java语言的重要特性之一,它通过自动化管理内存,减轻了程序员处理内存分配与释放的负担,提高了代码的...
**JVM内存模型及垃圾收集策略解析** Java虚拟机(JVM)是Java程序运行的基础,它为Java程序提供了一个跨平台的运行环境。在深入理解JVM内存模型与垃圾收集策略之前,我们首先需要知道JVM的主要组成部分:类装载器、...
Java垃圾回收机制的实现通常结合了多种算法,比如分代收集(Generational Collection),将堆分为新生代和老年代,针对不同生命周期的对象使用不同的回收策略,以优化性能。新生代通常使用复制算法,而老年代则可能...
一个命令行工具,用于解析Java垃圾收集日志并进行分析,以支持针对OpenJDK和Sun / Oracle JDK的JVM调整和故障排除。 它与其他工具的不同之处在于,它超出了计算统计信息(例如最大暂停时间和吞吐量)的简单数学范围...
以下是对Java垃圾回收的深入解析: 1. **垃圾回收的基本概念** - **对象生命周期**:当程序创建一个对象时,Java虚拟机(JVM)会在堆内存中为这个对象分配内存空间。一旦对象不再被任何引用指向,那么这个对象就...
本文将全面解析JVM中的七种垃圾收集器,分析它们的特性和适用场景,帮助开发者理解如何优化Java应用的内存管理。 1. **Serial GC** Serial GC是JVM的默认新生代收集器,它采用单线程进行垃圾回收,适用于小型应用...
9. **JVM**:理解Java虚拟机的工作原理,包括内存管理(堆、栈、方法区等)、垃圾回收、性能优化等。 10. **框架与库**:Spring框架用于企业级应用开发,Hibernate是常用的ORM框架,Apache的 Commons 和 Guava 等库...
1. 内存管理:JVM内存模型,堆内存、栈内存、方法区,以及垃圾收集机制(GC)的工作原理。 2. 类加载器:理解双亲委派模型,自定义类加载器的编写。 3. 并发编程:线程池的使用,ExecutorService,Future,Callable...
在gcparse项目中,ANTLR被用来解析Java垃圾收集日志的特定语法,将其转换成易于理解和分析的结构。 在Java中,垃圾收集是自动进行的,主要目标是释放不再使用的对象所占用的内存。Java提供了多种垃圾收集器,如...
黄泽忠的资料深入探讨了这个主题,以下是对JVM垃圾收集的详细解析。 首先,理解JVM内存结构是至关重要的。Java内存分为堆内存和栈内存。堆内存主要存放对象实例,而栈内存用于存储方法调用时的局部变量、方法参数等...
垃圾收集主要是为了回收不再使用的对象,释放内存空间,其中分代收集算法是通过将对象按照生命周期的不同进行分区来提高垃圾回收效率。 Java虚拟机的平台无关性是通过Java的Class文件实现的。Class文件由魔数、版本...
### Java垃圾回收(Garbage Collection)深度解析 #### 核心概念与机制 Java垃圾回收(Garbage Collection,简称GC)是Java运行时环境(JRE)中的一个关键特性,它自动管理对象的生命周期,释放不再使用的对象所...
当对象不再被引用时,垃圾收集器(Garbage Collector)会在适当的时候回收这部分内存。 2. 栈区(Stack): - 每个线程都有自己的独立栈区,用于存储基础数据类型(如int、float等)和对象的引用。请注意,对象...
3. **兼容性**:支持多种Java垃圾收集器的日志格式,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1等。 4. **自定义配置**:用户可以根据需要配置不同的视图和参数,定制化分析体验。 5. **源代码开放**:...