资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Java内存管理-GC机制-张焱林引言虽然Java是由C+发展而来的,保留了C+的大部分内容,其编程 方式也类似于C+,但Java的句法更加清晰、规模更小、更易学。Sun 公司对多种程序设计语言进行了深入的研究,摒弃了其他语言的不足之 处,最终推出了Java语言。我们在学校的学习步调从C语言和C+再接触Java的,作为从C语言 学过来的,最明显的区别大概就是Java没有C/C+里的那复杂的指针, 然而,这次串讲我并不打算勾起很多人学那东西的痛苦的回忆。所以我 打算在这次串讲中说说Java与C/C+区别之一的内存管理中GC机制。有 所不足,还望包涵。GC是什么曾经听过这么一个比方,说C语言的程序员和Java的程序员只要一 起去食堂吃个饭,只要看他们最后会不会把餐盘端去回收处就可以很清 楚的知道哪个是C语言的程序员,哪个是Java的程序员。说的正是Java 与 C+/C的主要区别之一,作为Java开发者,一般不需要专门编写内 存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序 员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾 清扫机制。概括地说,Java GC(Garbage Collection,垃圾收集,垃圾 回收)机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定 哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息 ,保证JVM中的内存空间,避免出现内存泄露和溢出问题。GC做了什么Java GC机制主要完成3件事:1.确定哪些内存需要回收,2.确定什么时候需要执行GC,3.如何执行GC。当然GC都是由JVM自动执行的,就如我们在食堂吃完饭,会有一位 保洁阿姨,当然也可能是大叔,来帮我们处理我们完成吃饭这件事以后 剩余的垃圾。为何要理解GC机制经过这么长时间的发展(事实上,在Java语言出现之前,就有 GC 机制的存在,如Lisp语言),Java GC机制已经日臻完善,几乎可以自 动的为我们做绝大多数的事情。然而,如果我们从事较大型的应用软件 开发,出现内存优化的需求,就必定要研究 Java GC机制。学习Java GC机制,可以帮助我们在日常工作中排查各种内存溢出 或泄露问题,解决性能瓶颈,达到更高的并发量,写出更高效的程序。 在通常情况下,我们掌握Java的内存管理是为了应对网站/服务器访 问慢的问题,其中垃圾收集对性能的影响可分为以下几点:1.内存泄漏2.程序暂停3.系统吞吐量显著下降4.响应时间变慢如何理解GC机制其实这个放大来说可以说好久,而且还和线程相关,也包括Java是 如何通过引用来对象的访问等等一系列的问题。但是考虑到串讲的时间 问题。我就挑几点谈谈1.Java中finalize()。2.垃圾回收只与内存有关。3.垃圾回收如何工作。Java中finalize()Java中finalize()的作用是清理那些对象获得的内存区域。程序员可 以用finalize()来操作,当然,Java有垃圾回收器负责回收无用对象占据 的内存资源。finalize()工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象 占用的存储空间,将首先调用其finalize()的方法。并且在下一次垃圾回 收动作发生时,才会真正回收对象占用的内存。所以要是你打算用 finalize(),就能在垃圾回收时刻做一些重要的清理工作注意这里的finalize()并不是C+里的析构.在C+中,对象一定会被 销毁,而在Java里的对象却并非总是被垃圾回收即对象可能不被垃圾回 收;垃圾回收并不等于“析构”。垃圾回收只与内存有关也就是说,使用垃圾回收器的唯一原因是为了回收程序不再使用的 内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()方法), 它们也必须同内存及其回收有关。无论对象是如何创建的,垃圾回收器 都会负责释放对象占据的所有内存。垃圾回收如何工作对于GC的流程的基本描述如下:找出堆中活着的对象释放死对象占用的资源定期调整活对象的位置 GC算法一般有以下几种:1.Mark-Sweep 标记-清除2.Mark-Sweep-Compact 标记-整理3.Copying Collector 复制算法1.Mark-标记从“GC root”开始扫描,给能够沿着roots到达的对象为“live”,最终所 有能够到达的对象都被标记为“live”,而无法到达的对象则为“dead”。 效率和存活对象的数量是线性相关的。 2.Sweep-清除扫描堆,定位到所有的“dead”对象,并清理掉。效率和堆的大小是 线性相关的。 3.Compact-压缩对于对象的清除,会产生一些内存碎片,这时候就需要对这些内存 进行压缩整理、整理。效率和存活对象的数量是线性相关的。 4.Copy-复制将内存分为“form”和“to”两个区域,垃圾回收时,将from区域的存活 对象整体复制到to区域中。效率和存活对象的数量是线性相关的。感谢您的欣赏!
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号