- 浏览: 1148785 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
垃圾回收的瓶颈
传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限。但是他无法解决的一个问题,就是Full GC所带来的应用暂停。在一些对实时性要求很高的应用场景下,GC暂停所带来的请求堆积和请求失败是无法接受的。这类应用可能要求请求的返回时间在几百甚 至几十毫秒以内,如果分代垃圾回收方式要达到这个指标,只能把最大堆的设置限制在一个相对较小范围内,但是这样有限制了应用本身的处理能力,同样也是不可 接收的。
分代垃圾回收方式确实也考虑了实时性要求而提供了并发回收器,支持最大暂停时间的设置,但是受限于分代垃圾回收的内存划分模型,其效果也不是很理想。
为了达到实时性的要求(其实Java语言最初的设计也是在嵌入式系统上的),一种新垃圾回收方式呼之欲出,它既支持短的暂停时间,又支持大的内存空间分配。可以很好的解决传统分代方式带来的问题。
增量收集的演进
增量收集的方式在理论上可以解决传统分代方式带来的问题。增量收集把对堆空间划分成一系列内存块,使用时,先使用其中一部分(不会全部用完),垃圾收集时 把之前用掉的部分中的存活对象再放到后面没有用的空间中,这样可以实现一直边使用边收集的效果,避免了传统分代方式整个使用完了再暂停的回收的情况。
当然,传统分代收集方式也提供了并发收集,但是他有一个很致命的地方,就是把整个堆做为一个内存块,这样一方面会造成碎片(无法压缩),另一方面他的每次 收集都是对整个堆的收集,无法进行选择,在暂停时间的控制上还是很弱。而增量方式,通过内存空间的分块,恰恰可以解决上面问题。
Garbage Firest(G1)
这部分的内容主要参考这里 ,这篇文章算是对G1算法论文的解读。我也没加什么东西了。
目标
从设计目标看G1完全是为了大型应用而准备的。
支持很大的堆
高吞吐量
--支持多CPU和垃圾回收线程
--在主线程暂停的情况下,使用并行收集
--在主线程运行的情况下,使用并发收集
实时目标: 可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收
当然G1要达到实时性的要求,相对传统的分代回收算法,在性能上会有一些损失。
算法详解
G1可谓博采众家之长,力求到达一种完美。他吸取了增量收集优点,把整个堆划分为一个一个等大小的区域(region)。内存的回收和划分都以 region为单位;同时,他也吸取了CMS的特点,把这个垃圾回收过程分为几个阶段,分散一个垃圾回收过程;而且,G1也认同分代垃圾回收的思想,认为 不同对象的生命周期不同,可以采取不同收集方式,因此,它也支持分代的垃圾回收。为了达到对回收时间的可预计性,G1在扫描了region以后,对其中的 活跃对象的大小进行排序,首先会收集那些活跃对象小的region,以便快速回收空间(要复制的活跃对象少了),因为活跃对象小,里面可以认为多数都是垃 圾,所以这种方式被称为Garbage First(G1)的垃圾回收算法,即:垃圾优先的回收。
回收步骤:
初始标记(Initial Marking)
G1对于每个region都保存了两个标识用的bitmap,一个为previous marking bitmap,一个为next marking bitmap,bitmap中包含了一个bit的地址信息来指向对象的起始点。
开始Initial Marking之前,首先并发的清空next marking bitmap,然后停止所有应用线程,并扫描标识出每个region中root可直接访问到的对象,将region中top的值放入next top at mark start(TAMS)中,之后恢复所有应用线程。
触发这个步骤执行的条件为:
G1定义了一个JVM Heap大小的百分比的阀值,称为h,另外还有一个H,H的值为(1-h)*Heap Size,目前这个h的值是固定的,后续G1也许会将其改为动态的,根据jvm的运行情况来动态的调整,在分代方式下,G1还定义了一个u以及soft limit,soft limit的值为H-u*Heap Size,当Heap中使用的内存超过了soft limit值时,就会在一次clean up执行完毕后在应用允许的GC暂停时间范围内尽快的执行此步骤;
在pure方式下,G1将marking与clean up组成一个环,以便clean up能充分的使用marking的信息,当clean up开始回收时,首先回收能够带来最多内存空间的regions,当经过多次的clean up,回收到没多少空间的regions时,G1重新初始化一个新的marking与clean up构成的环。
并发标记(Concurrent Marking)
按照之前Initial Marking扫描到的对象进行遍历,以识别这些对象的下层对象的活跃状态,对于在此期间应用线程并发修改的对象的以来关系则记录到remembered set logs中,新创建的对象则放入比top值更高的地址区间中,这些新创建的对象默认状态即为活跃的,同时修改top值。
最终标记暂停(Final Marking Pause)
当应用线程的remembered set logs未满时,是不会放入filled RS buffers中的,在这样的情况下,这些remebered set logs中记录的card的修改就会被更新了,因此需要这一步,这一步要做的就是把应用线程中存在的remembered set logs的内容进行处理,并相应的修改remembered sets,这一步需要暂停应用,并行的运行。
存活对象计算及清除(Live Data Counting and Cleanup)
值得注意的是,在G1中,并不是说Final Marking Pause执行完了,就肯定执行Cleanup这步的,由于这步需要暂停应用,G1为了能够达到准实时的要求,需要根据用户指定的最大的GC造成的暂停时间来合理的规划什么时候执行Cleanup,另外还有几种情况也是会触发这个步骤的执行的:
G1采用的是复制方法来进行收集,必须保证每次的”to space”的空间都是够的,因此G1采取的策略是当已经使用的内存空间达到了H时,就执行Cleanup这个步骤;
对于full-young和partially-young的分代模式的G1而言,则还有情况会触发Cleanup的执行,full-young模式下,G1根据应用可接受的暂停时间、回收young regions需要消耗的时间来估算出一个yound regions的数量值,当JVM中分配对象的young regions的数量达到此值时,Cleanup就会执行;partially-young模式下,则会尽量频繁的在应用可接受的暂停时间范围内执行Cleanup,并最大限度的去执行non-young regions的Cleanup。
展望
以后JVM的调优或许跟多需要针对G1算法进行调优了。
发表评论
-
JConsole手册
2012-01-13 08:03 1300一篇Sun官方网站上介绍JConsole使用的文章 ,前段时 ... -
JVM调优总结(九)-参考资料
2012-01-12 07:55 1050能整理出上面一些东西,也是因为站在巨人的肩上。下面是一些参考 ... -
JVM调优总结(八)-反思
2012-01-11 08:11 999垃圾回收的悖论 所谓“成也萧何败萧何”。Ja ... -
JVM调优总结(七) - 调优方法
2012-01-11 08:11 977JVM调优工具 Jconsole,jProfile,Vi ... -
JVM调优总结(五)-典型配置举例
2012-01-11 08:10 970以下配置主要针对分代垃圾回收算法而言。 堆大小设置 ... -
JVM调优总结(四)-分代垃圾回收详述
2012-01-10 08:33 1056为什么要分代 分代的垃圾回收策略,是基于这样一个事实 ... -
JVM调优总结(三)- 垃圾回收面临的问题
2012-01-10 08:31 1012如何区分垃圾 ... -
JVM调优总结(二)-基本垃圾回收算法
2012-01-10 08:28 1210可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 ... -
JVM调优总结(一):一些概念
2012-01-10 08:16 1169写道 Java虚拟机中,数据类型可以分为两类:基本类型和引 ... -
Eclipse.ini
2012-01-05 11:02 1071今天同学问我Eclipse文件夹下有个Eclipse.ini文 ... -
JAVA启动参数大全之三:非Stable参数
2011-10-25 13:41 1069前面我们提到用-XX作为前缀的参数列表在jvm中可能是不健壮的 ... -
JAVA启动参数大全之二:非标准参数
2011-10-25 13:38 1302非标准参数又称为扩展参数,其列表如下: -Xint 设置jv ... -
JAVA启动参数大全之一:标准参数
2011-10-25 13:37 1264前段时间系统升级时遭 ...
相关推荐
此外,文档还提到了新一代垃圾回收算法,例如G1垃圾回收器,它旨在解决之前算法的一些限制,比如暂停时间过长的问题。 最后,文档强调了调优方法的重要性,并提出了反思,即在进行JVM调优时需要根据应用的实际需求...
新一代的垃圾回收算法,如Garbage First(G1)收集器,旨在更好地处理大内存应用的性能问题。G1收集器将堆内存划分为多个区域,跟踪各区域垃圾回收的价值和成本,并优先收集价值最高的区域。 在调优过程中,我们...
本篇文章将详细讲解"JVM调优总结(4)分代垃圾回收"这一主题,旨在帮助Java开发者掌握更加高效、稳定的应用运行策略。 一、分代垃圾回收理论基础 Java的内存管理主要依靠垃圾回收机制,它自动回收不再使用的对象,...
- **G1(Garbage-First)**:新一代垃圾收集器,目标是达到可预测的停顿时间。 三、JVM性能调优 1. **内存参数调整**:通过`-Xms`和`-Xmx`设置堆内存初始大小和最大大小,`-XX:NewRatio`设定年轻代和老年代的比例...
4. G1(Garbage-First):新一代的垃圾收集器,目标是实现可预测的暂停时间模型。 四、垃圾回收调优 1. 参数调整:例如-Xms和-Xmx设置堆大小,-XX:NewRatio设置新生代和老年代的比例,-XX:SurvivorRatio设定新生代...
- **G1(Garbage-First)GC**:新一代垃圾收集器,目标是达到可预测的暂停时间模型。 3. **性能监控工具**: - **JVisualVM**:集成了多种JVM监控功能,如内存、线程、类加载、CPU使用率等。 - **JConsole**:...
- **G1(Garbage-First)**:新一代垃圾回收器,目标是预测和控制垃圾回收停顿时间。 4. **垃圾回收参数调优** - **JVM选项**:如-Xms, -Xmx设置堆大小,-XX:NewRatio设置新生代与老年代的比例,-XX:...
- **ZGC (Z Garbage Collector)**:新一代的低延迟垃圾回收器,目标是10毫秒以内的暂停时间,适用于大型系统。 - **Shenandoah GC**:另一个低暂停时间的回收器,特点是并发地处理大部分垃圾回收工作。 4. **GC...
- **G1(Garbage-First)**:新一代垃圾收集器,目标是实现可预测的暂停时间。 - **ZGC** 和 **Shenandoah**:实验性的低暂停时间收集器,ZGC在JDK 11成为实验特性,Shenandoah在JDK 15正式版。 6. **JVM调优**:...
- **G1(Garbage-First)Collector**:新一代的垃圾回收器,目标是达到可预测的暂停时间。 4. **代码示例与注释** - 在Java中,我们可以通过`System.gc()`触发垃圾回收,但不推荐这样做,因为这可能导致非确定性...
G1收集器则是新一代的垃圾收集器,目标是实现可预测的暂停时间模型,通过分区技术来优化内存回收。 CMS收集器的工作流程包括初始标记、并发标记、最终标记和并发清除四个阶段,其中并发标记和并发清除阶段与应用...
4. **G1(Garbage-First)**:新一代的垃圾收集器,目标是实现可预测的暂停时间模型,适用于大型应用。 五、GC调优 理解并优化GC是提升Java应用性能的关键。调优包括调整堆大小、设置新生代与老年代的比例、选择...
- **G1(Garbage-First)GC**:新一代垃圾收集器,目标是可预测的暂停时间模型。 5. **GC调优** 调整垃圾收集器参数,如新生代与老年代的比例、堆大小、GC频率等,可以优化性能。工具如VisualVM、JConsole等帮助...
G1是新一代的垃圾收集器,目标是实现可预测的暂停时间模型。 针对内存调优,我们需要关注以下几点: 1. 合理设置堆大小:根据应用的内存需求,设置-Xms和-Xmx参数来控制堆的初始和最大大小,避免因内存不足导致的...
9. **G1垃圾收集器**:G1是JDK 1.6引入的新一代垃圾收集器,目标是实现低暂停时间并能预测垃圾回收时间。它将堆划分为多个Region,并采用并发标记和增量式压缩策略。 10. **Java 11及以后的ZGC和Shenandoah**:这两...