
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java垃圾回收机制的学习与应用是每一位Java程序员都需要熟练掌握的一个编程技术,而本文我们就通过案例分析来简单了解一下,Java垃圾回收基础知识分享。
1、垃圾收集策略与算法
程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而对于Java堆和方法区,我们只有在程序运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的正是这部分内存。
2、判定对象是否存活
若一个对象不被任何对象或变量引用,那么它就是无效对象,需要被回收。
(1)引用计数法
在对象头维护着一个counter计数器,对象被引用一次则计数器+1;若引用失效则计数器-1。当计数器为0时,就认为该对象无效了。
引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法。但是主流的Java虚拟机里没有选用引用计数算法来管理内存,主要是因为它很难解决对象之间循环引用的问题。
举个栗子对象objA和objB都有字段instance,令objA.instance=objB并且objB.instance=objA,由于它们互相引用着对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。
(2)可达性分析法
所有和GCRoots直接或间接关联的对象都是有效对象,和GCRoots没有关联的对象就是无效对象。
GCRoots是指:
Java虚拟机栈(栈帧中的本地变量表)中引用的对象
本地方法栈中引用的对象
方法区中常量引用的对象
方法区中类静态属性引用的对象
GCRoots并不包括堆中对象所引用的对象,这样就不会有循环引用的问题。
3、HotSpot垃圾收集器
HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个好的收集器。我们选择的只是对具体应用合适的收集器。
4、新生代垃圾收集器
(1)Serial垃圾收集器(单线程)只开启一条GC线程进行垃圾回收,并且在垃圾收集过程中停止一切用户线程(StopTheWorld)。
一般客户端应用所需内存较小,不会创建太多对象,而且堆内存不大,因此垃圾收集器回收时间短,即使在这段时间停止一切用户线程,也不会感觉明显卡顿。因此Serial垃圾收集器适合客户端使用。
由于Serial收集器只使用一条GC线程,避免了线程切换的开销,从而简单高效。
(2)ParNew垃圾收集器(多线程)
ParNew是Serial的多线程版本。由多条GC线程并行地进行垃圾清理。但清理过程依然需要StopTheWorld。
ParNew追求“低停顿时间”,与Serial区别就是使用了多线程进行垃圾收集,在多CPU环境下性能比Serial会有一定程度的提升;但线程切换需要额外的开销,因此在单CPU环境中表现不如Serial。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。