微信号:infoqchina

介绍:有内容的技术社区媒体

可视化Java垃圾回收

2014-02-28 17:58 InfoQ

垃圾回收,就像双陆棋一样,只需几分钟来学习,但要用一生来精通。


Ben Evans是一名资深培训师兼顾问,他在演讲可视化垃圾回收中从基础谈起讨论了垃圾回收。本文是对其演讲的简要总结。


当谈到释放不再使用的内存,垃圾回收已经在很大程度上取代了早期技术,比如手动内存管理和引用计数。


这是好事,因为内存管理令人厌烦,学究式地簿记是计算机擅长的,而不是人擅长的。在这方面,语言的运行时环境比人要强。


现代的垃圾回收非常高效,远远超过早期语言中典型的手工分配。通常,具有其它语言背景的人只盯着垃圾回收造成的中断,却没有完全理解自动内存管理发生作用的上下文环境。


标记&清除是Java(及其它运行时环境)用于垃圾回收的基本算法。在标记&清除算法中,引用会从每个线程栈的桢指向程序的堆。所以,从栈开始,循着指针找到所有可能的引用,然后再循着这些引用递归下去。当递归完成,就找到了所有的活对象,其它的都是垃圾。


请注意,人们经常漏掉的一点是,运行时环境本身也有一个“分配清单(allocation list)”,上面列出了指向每个对象的指针,该列表由垃圾回收器负责维护,并帮助垃圾回收器进行垃圾清理。因此,运行时环境总是可以找出由它创建但尚未回收的对象。



上面插图中所示的栈只是一个与单个应用程序线程相关的栈;每个应用程序线程都有一个类似的栈,每个栈本身都有一组指向堆的指针。


如果垃圾回收器试图在应用程序运行过程中获取活对象的快照,那么它就要追踪运动着的目标,那样很容易漏掉一些严重超时的对象分配,因而无法获得一个准确的快照。因此,“Stop the World”是有必要的;也就是,停止应用程序线程足够长的时间,以便捕获活对象的快照。


下面是垃圾回收器必须遵循的两条黄金法则:

  • 垃圾回收器必须回收所有的垃圾。

  • 垃圾回收器绝对不能回收任何活对象。


但这两条规则并不是对等的;如果违反了第二条规则,结果会使数据遭到破坏。


另一方面,如果违反了第一条规则,则会是另一种情况,系统并不总是能够回收所有的垃圾,但最终会回收所有的垃圾,那么这是可以接受的,而实际上,这是垃圾回收器的基本原理。


介绍完基本原理,本文集合HotSpotJava虚拟机,介绍了实际系统中的内存管理机制,同时讲解了一些GC相关的配置和控制参数。本文最后给出的建议是:

  • 需要了解一些GC基础理论

  • 要让新生代的大部分对象在年轻时死亡

  • 打开GC日志!——原始日志文件难以阅读——使用工具

  • 使用工具来帮助自己调优——测量,而不是猜测


更多精彩内容,请点击阅读原文。


***********************************

本文来自InfoQ微信公众账号:infoqchina

1、回复“今日新闻”,查看今天更新的新闻;

2、回复“今日英文”,查看今天英文站的更新;

3、回复“文章 +关键词”,搜索关键词相关内容;

4、回复“QCon”,了解QCon大会相关信息;

5、回复“活动”,了解最近InfoQ组织的线下沙龙;

6、回复“架构师”,获取《架构师》下载地址;

7、回复“投稿”,了解投稿和加入编辑团队的流程。

***********************************

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 C#6.0 中的那些新特性 谁比奥美更需要首席数据官? 全志科技上半年净利润6265万元|漏洞隐藏18年x86处理器存在严重设计缺陷|华为小米自主芯片采用率提高联发科和高通受伤 Fenng,祝你能创建一家伟大的公司 和学编程的学霸谈恋爱真是好累啊……