- 浏览: 272779 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
highphd:
海量用户如何处理啊?缓存服务器?大数据?
面向海量服务的设计原则和策略总结 -
AKka:
看了这篇博文更感觉到自己要学的东西更多了。同时感谢博主的辛勤写 ...
[Java性能剖析]JVM Management API -
sswh:
非常不错,感谢分享!!
[Java性能剖析]Sun JVM Attach API -
muyexi:
请问在Android开发中的什么场景下,会用到ObjectWe ...
[字节码系列]ObjectWeb ASM构建Method Monitor -
zoutuo:
前辈可否告知其中的“吞吐量”指的是什么?谢谢!
[Java性能剖析]Sun JVM内存管理和垃圾回收
内存管理和垃圾回收是JVM非常关键的点,对Java性能的剖析而言,了解内存管理和垃圾回收的基本策略非常重要。本篇对Sun JVM 6.0的内存管理和垃圾回收做大概的描述。
1.内存管理
在程序运行过程当中,会创建大量的对象,这些对象,大部分是短周期的对象,小部分是长周期的对象,对于短周期的对象,需要频繁地进行垃圾回收以保证无用对象尽早被释放掉,对于长周期对象,则不需要频率垃圾回收以确保无谓地垃圾扫描检测。为解决这种矛盾,Sun JVM的内存管理采用分代的策略。
1)年轻代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁。年轻代分成1个Eden Space和2个Suvivor Space(命名为A和B)
- 当对象在堆创建时,将进入年轻代的Eden Space。
- 垃圾回收器进行垃圾回收时,扫描Eden Space和A Suvivor Space,如果对象仍然存活,则复制到B Suvivor Space,如果B Suvivor Space已经满,则复制 Old Gen
- 扫描A Suvivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个Old对象,则将其移到Old Gen。
- 扫描完毕后,JVM将Eden Space和A Suvivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和BSuvivor Space。
我们可以看到:Young Gen垃圾回收时,采用将存活对象复制到到空的Suvivor Space的方式来确保不存在内存碎片,采用空间换时间的方式来加速内存垃圾回收。
2)年老代(Tenured Gen):年老代主要存放JVM认为比较old的对象(经过几次的Young Gen的垃圾回收后仍然存在),内存大小相对会比较大,垃圾回收也相对没有那么频繁(譬如可能几个小时一次)。年老代主要采用压缩的方式来避免内存碎片(将存活对象移动到内存片的一边),当然,有些垃圾回收器(譬如CMS垃圾回收器)出于效率的原因,可能会不进行压缩。
3)持久代(Perm Gen):持久代主要存放类定义、字节码和常量等很少会变更的信息,关于这块的垃圾回收策略可以参考我的另一篇BLOG《Tomcat Context reloadabled 与 OutOfMemory(PermSpace)
》。
Class data sharing (CDS)( http://java.sun.com/j2se/1.5.0/docs/guide/vm/class-data-sharing.html)是JDK5新引入的特性,采用在虚拟机之间共享一些class定义信息(bootstrapClassLoader加载的类)的方式提速JVM的启动和内存的占用,主要用于客户端,如果需要对类进行instrutment,最好把CDS关闭。(默认情况下,JVM的server模式会关闭CDS,client模式会开启CDS)
Disable class data sharing.
-Xshare:on
Require class data sharing to be enabled. If it could not be enabled for various reasons, print an error message and exit.
-Xshare:auto
The default; enable class data sharing whenever possible.
我们通过JConsole截图看看上面这几个区的显示(下图),从左到右分别是EdenSpace、A Suvivor Space、Tenured Gen、Code Cache、Perm Gen(shared-wr)、Perm Gen(shared-ro)、Perm Gen
2.垃圾回收策略
评估垃圾回收策略的两个重要度量是:
- 吞吐量(Throughput ):JVM花费在垃圾回收上的时间越长,则吞吐量越低
- 暂停时间(Pause time):JVM垃圾回收过程当中有一个暂停期,在暂停期间,应用程序不能运行,暂停时间是暂停期的长度
非常遗憾的是,一般这两个指标是相互冲突的,改善其中一个会影响到另外一个,根据情景的不同我们决定是优先考虑吞吐量还是暂停时间,对于需要实时响应的应用,我们需要优先考虑暂停时间,对于后台运行应用,我们需要优先考虑吞吐量。
在考察各种垃圾回收器之前,我们需要了解一下几个重要的策略
- 并行(Parallel):并行表示使用多个线程同时进行垃圾回收的工作,此策略一般会从同时改善暂停时间和吞吐量,在有多CPU内核的服务器上,这是基本上我们要使用的策略。
- 并发(Concurrent):并行表示垃圾回收器的一些工作(譬如垃圾标记)与应用程序同时进行,这将更进一步缩短暂停时间,需要注意的是,同时垃圾回收器的复杂性会大大增大,基本上是会降低吞吐量,
- 内存碎片处理:有不压缩、压缩和拷贝三种策略,从空间上讲,拷贝将花费更多的内存(譬如如上内存管理的Young Gen,需要维持一个额外的Suvivor空间),从时间上来讲,不压缩会减低创建对象时的内存分配效率,在垃圾回收上,拷贝策略会比压缩策略更高效。
Sun JVM有4垃圾回收器:
- Serial Collector:序列垃圾回收器,垃圾回收器对Young Gen和Tenured Gen都是使用单线的垃圾回收方式,对Young Gen,会使用拷贝策略避免内存碎片,对Old Gen,会使用压缩策略避免内存碎片。基本上,在对内核的服务器上应该避免使用这种方式。在JVM启动参数中使用-XX:+UseSerialGC启用Serial Collector。
- Parallel Collector:并发垃圾回收器,垃圾回收器对Young Gen和Tenured Gen都是使用多线程并行垃圾回收的方式,对Young Gen,会使用拷贝策略避免内存碎片,对Old Gen,会使用压缩策略避免内存碎片。在JVM启动参数中使用-XX:+UseParallelGC启用Parallel Collector。
- Parallel Compacting Collector:并行压缩垃圾回收器,与Parallel Collector垃圾回收类似,但对Tenured Gen会使用一种更有效的垃圾回收策略,此垃圾回收器在暂停时间上会更短。在JVM启动参数中使用-XX:+UseParallelOldGC启用Parallel Compacting Collector。
- Concurrent Mark-Sweep (CMS) Collector:并发标志清除垃圾回收器,对Young Gen会使用与Parallel Collector同样的垃圾回收策略,对Tenured Gen,垃圾回收的垃圾标志线程与应用线程同时进行,而垃圾清除则需要暂停应用线程,但暂停时间会大大缩减,需要注意的是,由于垃圾回收过程更加复杂,会降低总体的吞吐量。
评论
-XX:+UseConcMarkSweepGC
但是有一个点:
如果B Suvivor Space已经满,则复制 Old Gen
我的理解是:
1.存活对象放不进B, 那么会选择存活对象中, 拷贝次数较高的搬移到old
2.存活对象大于B空间, 存活对象将被马上搬移到old
确实写地不够清晰,不够严谨
扫描eden和A的时候, 存活的对象会搬到B, 扫描eden和B的时候, 存活的对象会搬到A.
当某个对象被如此拷贝的次数达到一定的量的时候,该对象才会搬到old
呵呵,你对我的理解好象有问题,在这里,B(先假设是空的)并不一定能够满足存放所有存活的Eden Space和A Suvivor Space的对象,另外,你这里的描述同样可以见我下面的说明
恩,对的, 一样的意思
但是有一个点:
如果B Suvivor Space已经满,则复制 Old Gen
我的理解是:
1.存活对象放不进B, 那么会选择存活对象中, 拷贝次数较高的搬移到old
2.存活对象大于B空间, 存活对象将被马上搬移到old
-XX:MaxTenuringThreshold=<value>
This switch determines how much the objects may age in the young generation before getting promoted to the older generation. The default value is 31. For a big enough young generation and "survivor space", the long-lived objects may be copied up to 31 times between the survivor spaces before they are finally promoted to the old generation.
扫描eden和A的时候, 存活的对象会搬到B, 扫描eden和B的时候, 存活的对象会搬到A.
当某个对象被如此拷贝的次数达到一定的量的时候,该对象才会搬到old
呵呵,你对我的理解好象有问题,在这里,B(先假设是空的)并不一定能够满足存放所有存活的Eden Space和A Suvivor Space的对象,另外,你这里的描述同样可以见我下面的说明
-XX:MaxTenuringThreshold=<value>
This switch determines how much the objects may age in the young generation before getting promoted to the older generation. The default value is 31. For a big enough young generation and "survivor space", the long-lived objects may be copied up to 31 times between the survivor spaces before they are finally promoted to the old generation.
扫描eden和A的时候, 存活的对象会搬到B, 扫描eden和B的时候, 存活的对象会搬到A.
当某个对象被如此拷贝的次数达到一定的量的时候,该对象才会搬到old
发表评论
-
DCE VM HotSwap增强
2011-03-13 19:16 2617我们知道,在 Sun Ho ... -
JVM Java HeapSpace到达临界值的高CPU问题
2010-08-08 18:50 4034本周有同事反馈,IDC环境出现了CPU非常高的问题, ... -
JNI——小心,内存怪兽出没
2010-07-29 06:55 16824最近有一个同 ... -
Sun JVM Memory&GC参数配置
2010-05-06 05:56 4458参考: 《Memory Management in the ... -
[Java性能剖析] TPTP性能剖析介绍
2010-05-01 23:00 6566TPTP(Test & Performance ... -
[Java性能剖析]Eclipse Memory Analyzer介绍
2010-05-01 08:48 12813Eclipse Memory Analyzer是一 ... -
Java 栈内存介绍
2010-04-30 23:01 10893本篇我们了解一下Java的栈内存空间。 ... -
[Java性能剖析]Sun JDK可视化性能剖析工具介绍
2010-04-29 22:51 3175除了一些基础的工具,随Sun JDK一起发布的还有 ... -
[Java性能剖析]Sun JDK基本性能剖析工具介绍
2010-04-29 13:40 3416Sun JDK随版本同时发布了一些性能剖析的工具,这 ... -
[Java性能剖析]Sun JVM Attach API
2010-04-29 07:11 10638Sun JVM Attach API是Sun JVM ... -
[Java性能剖析]JPDA 4)Java Instrutment
2010-04-28 21:42 5270在前面的介绍 ... -
[Java性能剖析]JPDA 3)JDI/Debuger
2010-04-28 13:17 3857参考:http://java.sun.com/jav ... -
[Java性能剖析]JPDA 2)JVM TI
2010-04-28 07:03 4433参考:http://java.sun.com/ja ... -
[Java性能剖析]JPDA 1)总体结构
2010-04-27 06:31 2608JPDA(Java Platform D ... -
[Java性能剖析]JVM Management API
2010-04-26 13:52 14628JVM本身提供了一组管理的API,通过该API, ... -
[Java性能剖析]前言
2010-04-24 06:01 2666最近在学习Java性能剖析方面的主题,理论方面涉及 ... -
JVM内存管理和垃圾回收
2008-07-13 22:42 8066Java虚拟机的一个强大之 ...
相关推荐
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
我们将分析它是如何进行垃圾回收,内存管理,堆压缩,以及其他高级特性。我们还将研究如何配置JVM使得性能得以最优化。演讲者将列出对于IBM和SUN JVM在1.4.2以及1.5版本上对WebSphere有用的一组调优参数。如果您对...
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
圾回收完成后JVM 重新分配内存。 -Xss128k :设置每个线程的栈大小。JDK5.0 以后每个线程栈大小为1M,之前每个线程栈 大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个 值能生成更...
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
主要功能按照数据流量、流向及...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
【JavaCommunity-后端技术栈,...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
功能:【1.图计算 2....自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用...