java垃圾回收机制

java垃圾回收机制

ID:40761607

大小:18.54 KB

页数:3页

时间:2019-08-07

java垃圾回收机制_第1页
java垃圾回收机制_第2页
java垃圾回收机制_第3页
资源描述:

《java垃圾回收机制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、上次讲到引用类型和基本类型由于内存分配上的差异导致的性能问题。那么今天就来聊一下和内存释放(主要是gc)有关的话题。  事先声明一下:虽说sun公司已经被oracle吞并了,但是出于习惯,同时也为了偷懒节省打字,以下仍然称之为sun公司。 ★jvm的内存  在java虚拟机规范中(具体章节请看“这里”),提及了如下几种类型的内存空间:  ◇栈内存(stack):每个线程私有的。  ◇堆内存(heap):所有线程公用的。  ◇方法区(methodarea):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、类函数的代码、编译时常量等信息。  ◇原生方法栈(nativemetho

2、dstack):主要用于jni中的原生代码,平时很少涉及。  关于栈内存(stack)和堆内存(heap),已经在上次的帖子中扫盲过了,大伙儿应该有点印象。由于今天咱们要讨论的“垃圾回收”话题,主要是和堆内存(heap)有关。其它的几个玩意儿不是今天讨论的重点。等以后有空了,或许可以单独聊一下。  ★垃圾回收机制简介  其实java虚拟机规范中并未规定垃圾回收的相关细节。垃圾回收具体该怎么搞,完全取决于各个jvm的设计者。所以,不同的jvm之间,gc的行为可能会有一定的差异。下面咱拿sun官方的jvm来简单介绍一下gc的机制。  ◇啥时候进行垃圾回收?  一般情况下,当jvm发现堆内存比较紧

3、张、不太够用时,它就会着手进行垃圾回收工作。但是大伙儿要认清这样一个残酷的事实:jvm进行gc的时间点是无法准确预知的。因为gc启动的时刻会受到各种运行环境因素的影响,随机性太大。  虽说咱们无法准确预知,但如果你想知道每次垃圾回收执行的情况,还是蛮方便的。可以通过jvm的命令行参数“-xx:+printgc”把相关信息打印出来。  另外,调用system.gc()只是建议jvm进行gc。至于jvm到底会不会做,那就不好说啦。通常不建议自己手动调用system.gc(),还是让jvm自行决定比较好。另外,使用jvm命令行参数“-xx:+disableexplicitgc”可以让system.

4、gc()不起作用。  ◇谁来负责垃圾回收?  一般情况下,jvm会有一个或多个专门的垃圾回收线程,由它们负责清理回收垃圾内存。  ◇如何发现垃圾对象?  垃圾回收线程会从“根集(rootset)”开始进行对象引用的遍历。所谓的“根集”,就是正在运行的线程中,可以访问的引用变量的集合(比如所有线程当前函数的参数和局部变量、当前类的成员变量等等)。垃圾回收线程先找出被根集直接引用的所有对象(不妨叫集合1),然后再找出被集合1直接引用的所有对象(不妨叫集合2),然后再找出被集合2直接引用的所有对象......如此循环往复,直到把能遍历到的对象都遍历完。  凡是从根集通过上述遍历可以到达的对象,都称

5、为可达对象或有效对象;反之,则是不可达对象或失效对象(也就是垃圾)。  ◇如何清理/回收垃圾?  通过上述阶段,就把垃圾对象都找出来。然后垃圾回收线程会进行相应的清理和回收工作,包括:把垃圾内存重新变为可用内存、进行内存的整理以消除内存碎片、等等。这个过程会涉及到若干算法,有兴趣的同学可以参见“这里”。限于篇幅,咱就不深入聊了。  ◇分代  早期的jvm是不采用分代技术的,所有被gc管理的对象都存放在同一个堆里面。这么做的缺点比较明显:每次进行gc都要遍历所有对象,开销很大。其实大部分的对象生命周期都很短(短命对象),只有少数对象比较长寿;在这些短命对象中,又只有少数对象占用的内存空间大;其

6、它大量的短命对象都属于小对象(很符合二八原理)。  有鉴于此,从jdk1.2之后,jvm开始使用分代的垃圾回收(generationalgarbagecollection)。jvm把gc相关的内存分为年老代(tenured)和年轻代(nursery)、持久代(permanent,对应于jvm规范的方法区)。大部分对象在刚创建时,都位于年轻代。如果某对象经历了几轮gc还活着(大龄对象),就把它移到年老代。另外,如果某个对象在创建时比较大,可能就直接被丢到年老代。经过这种策略,使得年轻代总是保存那些短命的小对象。在空间尺寸上,年轻代相对较小,而年老代相对较大。  因为有了分代技术,jvm的gc也

7、相应分为两种:主要收集(majorcollection)和次要收集(minorcollection)。主要收集同时清理年老代和年轻代,因此开销很大,不常进行;次要收集仅仅清理年轻代,开销很小,经常进行。  ★gc对性能会有啥影响?  刚才介绍了gc的大致原理,那gc对性能会造成哪些影响捏?主要有如下几个方面:  ◇造成当前运行线程的停顿  早期的gc比较弱智。在它工作期间,所有其它的线程都被暂停(以免影响垃圾

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。