




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JVM 详 解之 Java 垃圾回收机制 详 解和 调优 (1发 布 时间 :2006.03.14 09:41来源:matrix 作者:cleverpig1.JVM 的 gc 概述gc 即垃圾收集机制是指 jvm 用于 释 放那些不再使用的 对 象所占用的内存。 java 语 言并不要 求 jvm 有 gc ,也没有 规 定 gc 如何工作。不 过 常用的 jvm 都有 gc ,而且大多数 gc 都使用 类 似的 算法管理内存和 执 行收集操作。在充分理解了垃圾收集算法和 执 行 过 程后,才能有效的 优 化它的性能。有些垃圾收集 专 用 于特殊的 应 用程序。比如, 实时应 用程序主要是 为
2、 了避免垃圾收集中断,而大多数 OLTP 应 用 程序 则 注重整体效率。理解了 应 用程序的工作 负 荷和 jvm 支持的垃圾收集算法,便可以 进 行 优 化配置垃圾收集器。垃圾收集的目的在于清除不再使用的 对 象。 gc 通 过 确定 对 象是否被活 动对 象引用来确定 是否收集 该对 象。 gc 首先要判断 该对 象是否是 时 候可以收集。两 种 常用的方法是引用 计 数和 对 象引用遍 历 。1.1. 引用 计 数引用 计 数存 储对 特定 对 象的所有引用数,也就是 说 ,当 应 用程序 创 建引用以及引用超出范 围时 , jvm 必 须 适当增减引用数。当某 对 象的引用数 为 0
3、时 ,便可以 进 行垃圾收集。1.2. 对 象引用遍 历早期的 jvm 使用引用 计 数, 现 在大多数 jvm 采用 对 象引用遍 历 。 对 象引用遍 历 从一 组对 象 开 始,沿着整个 对 象 图 上的 每 条 链 接, 递归 确定可到达(reachable 的 对 象。如果某 对 象不能从 这 些根 对 象的一个(至少一个到达, 则 将它作 为 垃圾收集。在 对 象遍 历阶 段, gc 必 须记 住哪 些 对 象可以到达,以便 删 除不可到达的 对 象, 这 称 为标记 (marking 对 象。下一 步 , gc 要 删 除不可到达的 对 象。 删 除 时 ,有些 gc 只是 简单
4、 的 扫 描堆 栈 , 删 除未 标记 的 未 标记 的 对 象,并 释 放它 们 的内存以生成新的 对 象, 这 叫做清除(sweeping 。 这种 方法的 问题 在于内存会分成好多小段,而它 们 不足以用于新的 对 象,但是 组 合起来却很大。因此, 许 多 gc可以重新 组织 内存中的 对 象,并 进 行 压缩 (compact ,形成可利用的空 间 。为 此, gc 需要停止其他的活 动 活 动 。 这种 方法意味着所有与 应 用程序相 关 的工作停止,只 有 gc 运行。 结 果,在响 应 期 间 增减了 许 多混 杂请 求。另外,更 复杂 的 gc不断增加或同 时 运行 以减少或
5、者清除 应 用程序的中断。有的 gc 使用 单线 程完成 这项 工作,有的 则 采用多 线 程以增 加效率。2. 几 种 垃圾回收机制2.1. 标记 -清除收集器这种 收集器首先遍 历对 象 图 并 标记 可到达的 对 象,然后 扫 描堆 栈 以 寻 找未 标记对 象并 释 放 它 们 的内存。 这种 收集器一般使用 单线 程工作并停止其他操作。2.2. 标记 -压缩 收集器有 时 也叫 标记 -清除-压缩 收集器,与 标记 -清除收集器有相同的 标记阶 段。在第二 阶 段, 则 把 标记对 象 复 制到堆 栈 的新域中以便 压缩 堆 栈 。 这种 收集器也停止其他操作。2.3. 复 制收集器
6、这种 收集器将堆 栈 分 为 两个域,常称 为 半空 间 。 每 次 仅 使用一半的空 间 , jvm 生成的新 对 象 则 放在另一半空 间 中。 gc 运行 时 ,它把可到达 对 象 复 制到另一半空 间 ,从而 压缩 了堆 栈 。 这 种 方法适用于短生存期的 对 象,持 续复 制 长 生存期的 对 象 则导 致效率降低。2.4. 增量收集器增量收集器把堆 栈 分 为 多个域, 每 次 仅 从一个域收集垃圾。 这 会造成 较 小的 应 用程序中 断。2.5. 分代收集器这种 收集器把堆 栈 分 为 两个或多个域,用以存放不同寿命的 对 象。 jvm 生成的新 对 象一般 放在其中的某个域
7、中。 过 一段 时间 , 继续 存在的 对 象将 获 得使用期并 转 入更 长 寿命的域中。分 代收集器 对 不同的域使用不同的算法以 优 化性能。2.6. 并 发 收集器并 发 收集器与 应 用程序同 时 运行。 这 些收集器在某点上(比如 压缩时 一般都不得不停止其 他操作以完成特定的任 务 ,但是因 为 其他 应 用程序可 进 行其他的后台操作,所以中断其他 处 理的 实际时间 大大降低。2.7. 并行收集器并行收集器使用某 种传统 的算法并使用多 线 程并行的 执 行它 们 的工作。在多 cpu 机器上使 用多 线 程技 术 可以 显 著的提高 java 应 用程序的可 扩 展性。3.
8、Sun HotSpot1.4.1 JVM堆大小的 调 整Sun HotSpot 1.4.1使用分代收集器,它把堆分 为 三个主要的域:新域、旧域以及永久域。 Jvm 生成的所有新 对 象放在新域中。一旦 对 象 经历 了一定数量的垃圾收集循 环 后,便 获 得使用期并 进 入旧域。在永久域中 jvm 则 存 储 class 和 method 对 象。就配置而言,永久域是一个独立域并且 不 认为 是堆的一部分。下面介 绍 如何控制 这 些域的大小。可使用 -Xms 和 -Xmx 控制整个堆的原始大小或最大 值 。 下面的命令是把初始大小 设 置 为 128M :java Xms128mXmx25
9、6m 为 控制新域的大小,可使用 -XX:NewRatio设 置新域在堆中所占的比例。下面的命令把整个堆 设 置成 128m ,新域比率 设 置成 3,即新域与旧域比例 为 1:3,新域 为 堆 的 1/4或 32M :java Xms128m Xmx128mXX:NewRatio =3可使用 -XX:NewSize和 -XX:MaxNewsize设 置新域的初始 值 和最大 值 。 下面的命令把新域的初始 值 和最大 值设 置成 64m:java Xms256m Xmx256m Xmn64m永久域默 认 大小 为 4m 。运行程序 时 , jvm 会 调 整永久域的大小以 满 足需要。 每
10、次 调 整 时 , jvm 会 对 堆 进 行一次完全的垃圾收集。使用 -XX:MaxPerSize标 志来增加永久域搭大小。在 WebLogic Server应 用程序加 载较 多 类 时 , 经 常需要增加永久域的最大 值 。当 jvm 加 载类时 ,永久域中的 对 象急 剧 增加,从而使 jvm 不 断 调 整永久域大小。 为 了避免 调 整,可使用 -XX:PerSize标 志 设 置初始 值 。下面把永久域初始 值设 置成 32m ,最大 值设 置成 64m 。java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSi
11、ze=64m默 认 状 态 下, HotSpot 在新域中使用 复 制收集器。 该 域一般分 为 三个部分。第一部分 为 Eden , 用于生成新的 对 象。另两部分称 为 救助空 间 ,当 Eden 充 满时 ,收集器停止 应 用程序,把所有可 到达 对 象 复 制到当前的 from 救助空 间 ,一旦当前的 from 救助空 间 充 满 ,收集器 则 把可到达 对 象 复 制到当前的 to 救助空 间 。 From 和 to 救助空 间 互 换 角色。 维 持活 动 的 对 象将在救助空 间 不 断 复 制,直到它 们获 得使用期并 转 入旧域。使用 -XX:SurvivorRatio 可
12、控制新域子空 间 的大小。同 NewRation 一 样 , SurvivorRation 规 定某救助域与 Eden 空 间 的比 值 。比如,以下命令把新 域 设 置成 64m , Eden 占 32m , 每 个救助域各占 16m :java -Xms256m -Xmx256m -Xmn64m -XX:SurvivorRation =2如前所述,默 认 状 态 下 HotSpot 对 新域使用 复 制收集器, 对 旧域使用 标记 -清除-压缩 收集 器。在新域中使用 复 制收集器有很多意 义 ,因 为应 用程序生成的大部分 对 象是短寿命的。理想 状 态 下,所有 过 渡 对 象在移出
13、Eden 空 间时 将被收集。如果能 够这样 的 话 ,并且移出 Eden 空 间 的 对 象是 长 寿命的,那 么 理 论 上可以立即把它 们 移 进 旧域,避免在救助空 间 反 复复 制。但是, 应 用程序不能适合 这种 理想状 态 ,因 为 它 们 有一小部分中 长 寿命的 对 象。最好是保持 这 些中 长 寿命的 对 象并放在新域中,因 为复 制小部分的 对 象 总 比 压缩 旧域廉价。 为 控制新域中 对 象的 复 制,可用 -XX:TargetSurvivorRatio控制救助空 间 的比例(该值 是 设 置救助空 间 的使用比例。如救 助空 间 位 1M , 该值 50表示可用
14、500K 。 该值 是一个百分比,默 认值 是 50。当 较 大的堆 栈 使用 较 低的 sruvivorratio时 , 应 增加 该值 到 80至 90,以更好利用救助空 间 。用 -XX:maxtenuring threshold 可控制上限。为 放置所有的 复 制全部 发 生以及希望 对 象从 eden 扩 展到旧域,可以把 MaxTenuringThreshold 设 置成 0。 设 置完成后, 实际 上就不再使用救助空 间 了,因此 应 把 SurvivorRatio 设 成 最大 值 以最大化 Eden 空 间 , 设 置如下:java -XX:MaxTenuringThresh
15、old=0 XX:SurvivorRatio=50000 4.BEA JRockit JVM的使用Bea WebLogic 8.1使用的新的 JVM 用于 Intel 平台。在 Bea 安装完 毕 的目 录 下可以看到有一 个 类 似于 jrockit81sp1_141_03的文件 夹 。 这 就是 Bea新 JVM 所在目 录 。不同于 HotSpot 把 Java 字 节码编译 成本地 码 ,它 预 先 编译 成 类 。 JRockit 还 提供了更 细 致的功能用以 观 察 JVM 的运行 状 态 ,主要是独立的 GUI 控制台(只能适用于使用 Jrockit 才能使用 jrockit8
16、1sp1_141_03自 带 的 console 监 控一些 cpu 及 memory参数或者 WebLogic Server控制台。Bea JRockit JVM支持 4种 垃圾收集器:4.1.1. 分代 复 制收集器它与默 认 的分代收集器工作策略 类 似。 对 象在新域中分配,即 JRockit 文档中的 nursery 。 这 种 收集器最适合 单 cpu 机上小型堆操作。4.1.2. 单 空 间 并 发 收集器该 收集器使用完整堆,并与背景 线 程共同工作。尽管 这种 收集器可以消除中断,但是收集器 需花 费较长 的 时间寻 找死 对 象,而且 处 理 应 用程序 时 收集器 经 常
17、运行。如果 处 理器不能 应 付 应 用程序 产 生的垃圾,它会中断 应 用程序并 关闭 收集。分代并 发 收集器 这种 收集器在 护 理域使用排它 复 制收集器,在旧域中 则 使用并 发 收集器。 由于它比 单 空 间 共同 发 生收集器中断 频 繁,因此它需要 较 少的内存, 应 用程序的运行效率也 较 高,注意, 过 小的 护 理域可以 导 致大量的 临时对 象被 扩 展到旧域中。 这 会造成收集器超 负 荷运 作,甚至采用排它性工作方式完成收集。4.1.3. 并行收集器该 收集器也停止其他 进 程的工作,但使用多 线 程以加速收集 进 程。尽管它比其他的收集器 易于引起 长时间 的中断
18、,但一般能更好的利用内存,程序效率也 较 高。默认状态下,JRockit 使用分代并发收集器。要改变收集器,可使用-Xgc:,对应四个收集器分 别为 gencopy,singlecon,gencon 以及 parallel。可使用-Xms 和-Xmx 设置堆的初始大小和最大 值。要设置护理域,则使用- Xns:java jrockit Xms512m Xmx512m Xgc:gencon Xns128m 尽管 JRockit 支持-verbose:gc 开关,但它输出的信息会因收集器的不同而异。JRockit 还支持 memory、 load 和 codegen 的输出。 注意 :如果 使用
19、JRockit JVM 的话还可以使用 WLS 自带的 console (C:beajrockit81sp1_141_03bin 下)来监控一些数据,如 cpu, memery 等。要想能构监控必须 在启动服务时 startWeblogic.cmd 中加入Xmanagement 参数。 JVM 详解之 Java 垃圾回收机制详解和调优 (3) 发布时间:2006.03.14 09:41 来源:matrix 作者:cleverpig 5.如何从 JVM 中获取信息来进行调整 -verbose.gc 开关可显示 gc 的操作内容。打开它,可以显示最忙和最空闲收集行为发生的时 间、收集前后的内存大小
20、、收集需要的时间等。打开- xx:+ printgcdetails 开关,可以详细了解 gc 中的变化。打开-XX: + PrintGCTimeStamps 开关,可以了解这些垃圾收集发生的时间,自 jvm 启动以后以秒计量。最后,通过-xx: + PrintHeapAtGC 开关了解堆的更详细的信息。为了了解 新域的情况,可以通过-XX:=PrintTenuringDistribution 开关了解获得使用期的对象权。 6.Pdm 系统 JVM 调整 6.1.服务器:前提内存 1G 单 CPU 可通过如下参数进行调整:server 启用服务器模式(如果 CPU 多,服务器机建议使用此 项) Xms,Xmx 一般设为同样大小。 800m Xmn 是将 NewSize 与 MaxN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房产交易贷款资金网签解约等环节风险及作业标准试题附答案
- 语文数学比赛试卷及答案
- 科目一简单模拟考试题及答案
- 2025年群监网员考试试题及答案
- 化学与环境(碳排放)整合能力试题
- 化学能力倾向综合测试试题
- 古代文化的考试题及答案
- 2025年高考物理计算题规范书写训练试题
- 公考会考试题及答案
- 医护奇葩考试题目及答案
- 2025低空经济发展及关键技术概况报告
- GB/T 45683-2025产品几何技术规范(GPS)几何公差一般几何规范和一般尺寸规范
- 平顶山桥梁亮化施工方案
- 小学四年级秋季学期《数学》(人教版)课后练习(全册汇总)含答案
- 万家寨水利枢纽
- 肌肉牵伸技术概述
- 去极端化教育课件
- 组织行为学 马工程课件5 第五章 领导
- GB/T 32800.3-2016手持式非电类动力工具安全要求第3部分:钻和攻丝机
- GB/T 17421.4-2016机床检验通则第4部分:数控机床的圆检验
- STEAM课程开发和特色STEAM课程案例分析课件
评论
0/150
提交评论