Java语言具备GC(垃圾回收)的能力,内存管理不需要应用程序去过问,这很方便。但是,GC是怎么进行的,JVM的内存参数应该怎么调整,如何优化,往往我们不是太清楚。看过一些资料后,对Sun JVM的内存管理以及垃圾回收的机制大概有了一个概念,这里将这些资料归纳和翻译出来。本文内容主要基于Sun JVM 1.3.1,在后续版本中有不少优化措施,但是这些基本概念还是不变的。
这里假设大家对GC的概念和基本原理都已经了解,不详细叙述了。
当JVM 进行GC的时候,是要消耗CPU资源和需要一定时间的,这会影响到程序的正常运行,因此需要尽可能减少GC消耗的时间。Java程序运行过程中,对象的生命周期有长有短,其中相当大部分是都是比较短命的,例如局部的对象一用完就可以回收了。在大多数情况下,只要能够及时回收这些短命对象的内存,就能够确保 JVM有足够内存来分配给新的对象。因此JVM采用一种分代回收(generational collection) 的策略,用较高的频率对年轻的对象(young generation)进行扫描和回收,这种叫做minor collection,而对老对象(old generation)的检查回收频率要低很多,称为major collection。这样就不需要每次GC都将内存中所有对象都检查一遍。
Sun JVM 1.3 有两种最基本的内存收集方式:一种称为copying或scavenge,将所有仍然生存的对象搬到另外一块内存后,整块内存就可回收。这种方法有效率,但需要有一定的空闲内存,拷贝也有开销。这种方法用于minor collection。另外一种称为mark-compact,将活着的对象标记出来,然后搬迁到一起连成大块的内存,其他内存就可以回收了。这种方法不需要占用额外的空间,但速度相对慢一些。这种方法用于major collection.
在JVM 1.3及以后的版本中,还有其他可选的内存收集方法,通过特定的参数来设定。例如:增量式回收,每次只处理一小部分;替代单线程copying的多线程并行回收;替代mark-compact的concurrent mark-sweep回收等等。参考资料[4][5]中有更多描述。
JVM管理的内存,通常叫做堆(heap),可以用下面的图来描述。
JVM启动后,保留一段地址空间,这个空间的大小由-Xmx指定。这块空间的大小就是heap可能的最大值,但一开始不一定全都分配了物理内存,初始分配的heap大小由-Xms指定,如果-Xms小于-Xmx,剩余部分是virtual的,当需要的时候,再向OS申请。
绿色部分是young generation的内存,由一块Eden(伊甸园,有意思)和两块Survivor Space(1.4文档中称为semi-space)构成。新创建的对象的内存都分配自eden。两块Survivor Space总有会一块是空闲的,用作copying collection的目标空间。Minor collection的过程就是将eden和在用survivor space中的活对象copy到空闲survivor space中。所谓survivor,也就是大部分对象在伊甸园出生后,根本活不过一次GC。对象在young generation里经历了一定次数的minor collection后,年纪大了,就会被移到old generation中,称为tenuring。(是否仅当survivor space不足的时候才会将老对象tenuring? 目前资料中没有找到描述)
浅蓝色部分是old generation的内存。
深蓝色部分称为permanent generation,是JVM用来保存class object和meta data,大小由-XX:PermSize和-XX:MaxPermSize指定。大量动态生成(编译)和加载class会增加这部分内存的耗用。
剩余内存空间不足会触发GC,如eden空间不够了就要进行minor collection,old generation空间不够要进行major collection,permanent generation空间不足会引发full GC。
很多参数会影响里面各部分空间的分配。-XX:MinHeapFreeRatio与-XX:MaxHeapFreeRatio设定空闲内存占总内存的比例范围,这两个参数会影响GC的频率和单次GC的耗时。-XX:NewRatio决定young与old generation的比例。Young generation空间越大,minor collection频率越低,但是old generation空间小了,又可能导致major collection频率增加。-XX:NewSize和-XX:MaxNewSize直接指定了young generation的缺省大小和最大大小。
fig4.gif
-Xmx
set maximum Java heap size
-Xms
set initial Java heap size
-XX:MinHeapFreeRatio=40
Minimum percentage of heap free after GC to avoid expansion.
-XX:MaxHeapFreeRatio=70
Maximum percentage of heap free after GC to avoid shrinking.
-XX:NewRatio=2
Ratio of new/old generation sizes. [Sparc -client:8; x86 -server:8; x86 -client:12.]-client:8 (1.3.1+), x86:12]
-XX:NewSize=2.125m
Default size of new generation (in bytes) [5.0 and newer: 64 bit VMs are scaled 30% larger; x86:1m; x86, 5.0 and older: 640k]
-XX:MaxNewSize=
Maximum size of new generation (in bytes). Since 1.4, MaxNewSize is computed as a function of NewRatio.
-XX:SurvivorRatio=25
Ratio of eden/survivor space size [Solaris amd64: 6; Sparc in 1.3.1: 25; other Solaris platforms in 5.0 and earlier: 32]
-XX:PermSize=
Initial size of permanent generation
-XX:MaxPermSize=64m
Size of the Permanent Generation. [5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.]
(上面给出的缺省值不一定准确,不同JVM版本和不同OS环境下会有不同)
这里给出的只是基本的介绍,下面reference中的文章都很不错,对进一步了解或者查找性能优化参数都有帮助。
分享到:
- 2008-01-06 22:59
- 浏览 2222
- 评论(0)
- 论坛回复 / 浏览 (0 / 2330)
- 查看更多
相关推荐
Java 堆也是垃圾收集器管理的主要区域,如果从内存回收的角度看,由于现在收集器采用分代收集算法所以可以分为老年代和新生代,再细致有 Eden 空间、from 空间、to 空间,但是无论怎么划分,它都是只是存储对象实例...
JVM内存模型与垃圾回收是Java性能优化的关键部分。JVM(Java Virtual Machine)内存模型分为多个区域,包括新生代(New Generation)、老年代(Old Generation)和永久代(Permanent Generation)。新生代又细分为...
四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old、G1 JVM调优:命令行指令,设置堆内存大小的参数
Java虚拟机(JVM)是Java程序运行的基础,它的内存管理与垃圾回收机制对于程序的性能至关重要。在Java中,内存分为堆内存、栈内存、方法区、程序计数器和本地方法栈五个主要区域。下面我们将深入探讨这些区域以及...
Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它涉及到程序的性能和稳定性。本文将深入探讨JVM如何处理内存分配、垃圾检测与回收,以及具体的实现策略。 首先,垃圾回收机制的目标是自动识别并...
本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...
认识JVM内存优化, 避免最大的误区:认为JVM内存越大越好。看到一个线程 blocked就认为阻塞了。
Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至...总结来说,理解JVM的内存管理与垃圾回收机制对于优化Java应用性能至关重要,开发者需要根据应用特点选择合适的垃圾回收策略和参数设置,以实现高效且稳定的运行。
Java虚拟机(JVM)内存管理和垃圾回收是Java应用程序高效运行的关键组成部分。JVM自动管理内存,通过垃圾回收机制来释放不再使用的对象所占据的空间,从而避免程序员手动管理内存可能导致的内存泄漏问题。 1. 垃圾...
Java虚拟机(JVM)内存模型和垃圾回收机制是Java开发中至关重要的概念。本文将深入探讨这两个主题,帮助理解JVM如何管理和优化内存。 **一、类加载器和双亲委派机制** 类加载器是JVM的一个组成部分,负责加载Java...
Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它们直接影响着程序的性能和稳定性。本文将详细解析JVM内存结构以及垃圾回收机制。 首先,JVM内存主要分为四个区域: 1. **堆(Heap)**:这是...
垃圾回收是JVM自动进行内存管理的一种机制,其主要目标是回收不再使用的对象所占用的内存空间,以防止内存泄漏。GC分为多个阶段: 1. **标记(Marking)**:确定哪些对象是“活的”,哪些是可回收的。常见的算法有...
Java虚拟机(JVM)是Java程序运行的基础,它的历史发展和内存回收机制是Java开发者必须深入了解的关键领域。本文将详细探讨JVM的发展历程以及内存管理中的垃圾回收机制。 一、JVM的历史发展 1. **早期阶段**:1995...
6. **垃圾回收机制**:垃圾回收是JVM自动管理内存的过程,主要目标是回收不再使用的对象占用的空间。主要有以下几种算法: - **标记-清除(Mark-Sweep)**:标记出所有活动对象,然后清除未标记的对象。缺点是容易...
最后,文档还提供了更多资源链接,供感兴趣的读者深入了解JVM内存管理和垃圾收集。 从这些核心内容可以看出,《JVM内存管理白皮书》是JVM内存管理领域的权威资料。它不仅向读者提供了JVM垃圾收集机制的理论知识,还...
很久之前就一直在学习JVM,但是一直也没有好好的总结,最近终于有了空闲,将之前学习的内容整理成了一个PPT。 也希望大神们可以批评指正。 ppt中主要包含下面几部分: Java内存模型 内存分配策略 分代垃圾收集...
Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...
自己总结的jvm中内存和垃圾回收的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者