没有合适的资源?快使用搜索试试~ 我知道了~
首页java垃圾回收以及jvm参数调优概述
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。而且这两个问题针对的内存区域就是Java内存模型中的堆。垃圾回收机制的引入可以有效的防止内存泄露、保证内存的有效使用,也大大解放了Java程序员的双手,使得他们在编写程序的时候不再需要考虑内存管理。本文主要对java垃圾回收机制以及jvm参数等方面做个综述,也算是自己做开发这几年对这方面的一个总结。
资源详情
资源推荐
1
java 垃圾回收以及 jvm 参数调优概述
目录
目录 ........................................................................................................................................... 1
一、概述 ................................................................................................................................... 3
二、java 垃圾回收算法 ........................................................................................................... 3
2.1 引用计数算法 ............................................................................................................... 3
2.2 根搜索算法 ................................................................................................................... 4
2.3 标记-清除算法 ............................................................................................................. 5
2.4 复制算法 ....................................................................................................................... 5
2.5 标记-整理算法 ............................................................................................................. 6
2.6 分代收集算法 ............................................................................................................... 7
三、垃圾回收器 ....................................................................................................................... 9
3.1 垃圾回收器概述 ........................................................................................................... 9
3.2 串行垃圾回收器 Serial Garbage Collector ..................................................... 10
3.3 并行垃圾回收器 Parallel Garbage Collector ................................................. 10
3.4 并发垃圾回收器 CMS Garbage Collector ........................................................... 11
3.5 G1 垃圾收集 ................................................................................................................ 12
3.5.1 G1 Young GC ........................................................................................................... 13
3.5.2 Mix GC .................................................................................................................... 15
四、jvm 配置以及调优 .......................................................................................................... 19
4.1 堆大小设置 ................................................................................................................... 19
4.2 回收器选择 ................................................................................................................... 20
4.3 G1 调优 ......................................................................................................................... 21
4.4 常见配置汇总 ............................................................................................................... 22
4.5 案例分析 ....................................................................................................................... 23
五、知识补充 ......................................................................................................................... 27
5.1 引用 .............................................................................................................................. 27
5.1.1 引用概述 ............................................................................................................... 27
5.1.2 引用的种类及其定义 ........................................................................................... 27
5.2 方法区的回收 .............................................................................................................. 28
2
5.3 内存分配与回收策略 ................................................................................................. 28
5.4 Java 中的内存泄露问题 ............................................................................................ 29
5.5 ParallelScavenge 和 ParNew 区别 ............................................................................. 29
5.6 jvm 常用监控工具 ..................................................................................................... 30
参考资料 ................................................................................................................................. 32
3
一、概述
Java 技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对
象分配内存以及回收分配给对象的内存。而且这两个问题针对的内存区域就是 Java 内存模
型中的堆。垃圾回收机制的引入可以有效的防止内存泄露、保证内存的有效使用,也大大解
放了 Java 程序员的双手,使得他们在编写程序的时候不再需要考虑内存管理。本文主要对
java 垃圾回收机制以及 jvm 参数等方面做个综述,也算是自己做开发这几年对这方面的一个
总结。
二、java 垃圾回收算法
Java 虚拟机的内存区域中,程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的,
随线程生而生,随线程灭而灭;栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,
每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这三个区域的内存分
配和回收都具有确定性。垃圾回收重点关注的是堆和方法区部分的内存。
2.1 引用计数算法
引用计数算法是垃圾收集器中的早期策略。在这种方法中,堆中的每个对象实例都有一
个引用计数。当一个对象被创建时,且将该对象实例分配给一个引用变量,该对象实例的引
用计数设置为 1。当任何其它变量被赋值为这个对象的引用时,对象实例的引用计数加 1(a
= b,则 b 引用的对象实例的计数器加 1),但当一个对象实例的某个引用超过了生命周期或
者被设置为一个新值时,对象实例的引用计数减 1。特别地,当一个对象实例被垃圾收集时,
它引用的任何对象实例的引用计数器均减 1。任何引用计数为 0 的对象实例可以被当作垃圾
收集。
引用计数收集器可以很快的执行,并且交织在程序运行中,对程序需要不被长时间打断
的实时环境比较有利,但其很难解决对象之间相互循环引用的问题。如下面的程序和示意图
所示,对象 objA 和 objB 之间的引用计数永远不可能为 0,那么这两个对象就永远不能被回
收。
public classReferenceCountingGC { public Objectinstance = null; public static
voidtestGC(){ ReferenceCountingGC objA = newReferenceCountingGC (); ReferenceCountingGC
objB = newReferenceCountingGC ();
4
// 对象之间相互循环引用,对象 objA 和 objB 之间的引用计数永远不可能为
0objB.instance = objA; objA.instance = objB; objA = null; objB = null; System.gc(); }}
上述代码最后面两句将 objA 和 objB 赋值为 null,也就是说 objA 和 objB 指向的对象已
经不可能再被访问,但是由于它们互相引用对方,导致它们的引用计数器都不为 0,那么垃
圾收集器就永远不会回收它们。
引用计数算法实现简单,效率很高,微软的 COM 技术、ActionScript、Python 等都使用
了引用计数算法进行内存管理,但是引用计数算法对于对象之间相互循环引用问题难以解
决,因此 java 并没有使用引用计数算法。
2.2 根搜索算法
通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所走过的路
径称为引用链(Reference Chain),当一个对象到 GC Root 没有任何引用链相连时,则该对象不
可达,该对象是不可使用的,垃圾收集器将回收其所占的内存。
主流的商用程序语言 C#、java 和 Lisp 都使用根搜素算法进行内存管理。
在 java 语言中,可作为 GC Root 的对象包括以下几种对象:
a. java 虚拟机栈(栈帧中的本地变量表)中的引用的对象。
b.方法区中的类静态属性引用的对象。
c.方法区中的常量引用的对象。
d.本地方法栈中 JNI 本地方法的引用对象。
java 方法区在 Sun HotSpot 虚拟机中被称为永久代,很多人认为该部分的内存是不用回
收的,java 虚拟机规范也没有对该部分内存的垃圾收集做规定,但是方法区中的废弃常量和
无用的类还是需要回收以保证永久代不会发生内存溢出。
判断废弃常量的方法:如果常量池中的某个常量没有被任何引用所引用,则该常量是废
弃常量。
判断无用的类:
(1).该类的所有实例都已经被回收,即 java 堆中不存在该类的实例对象。
(2).加载该类的类加载器已经被回收。
(3).该类所对应的 java.lang.Class 对象没有任何地方被引用,无法在任何地方通过反射机
制访问该类的方法。
5
2.3 标记-清除算法
最基础的垃圾收集算法,算法分为“标记”和“清除”两个阶段:该算法首先从根集合
进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象并进行
回收,如下图所示。
标记-清除算法的缺点有两个:首先,效率问题,标记和清除效率都不高。其次,标记清
除之后会产生大量的不连续的内存碎片,空间碎片太多会导致当程序需要为较大对象分配内
存时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
2.4 复制算法
复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块
的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一
次清理掉。这种算法适用于对象存活率低的场景,比如新生代。这样使得每次都是对整个半
区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺
序分配内存即可,实现简单,运行高效。该算法示意图如下所示:
剩余31页未读,继续阅读
a925907195
- 粉丝: 267
- 资源: 41
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功