内存管理第一篇--HotSpotVM-内存管理介绍

说明

  • ==本文摘自【MemoryManagement-Whitepaper-1-150020.pdf】并转译,本文并不是完整的转译,部分地方有删减;==
  • ==本人水平有限,如有不正确的地方烦请指出,感激不尽。==

内存管理介绍

在Java平台的J2SE中,有一个关键的功能就是它可以进行自动内存管理,从而保护开发人员不受显式内存管理的复杂性。

这篇文档概述了Java HotSpot虚拟机在Sun的J2SE 5.0发布版中提供的内存管理,它描述了能有效进行内存管理的垃圾回收器,并对选择、配置回收器和设置回收器操作内存区的大小提供了不少的建议,最后列出了一些最常用的能够影响垃圾回收器行为的参数选项以及更详细的相关文档。

在第2节中,只是为了给读者明白内存自动管理的新概念,它和那些要求程序员明确释放数据空间的管理方式有很大的争论。第3节中就简述常见垃圾回收的概念、设计选择和性能标准,它同时也介绍了根据对象的预期寿命放入不同的内存区域的分代概念,分代的引入对减少垃圾回收的暂停时间和应用程序的整体成本有很明显的成效。

本文档的剩余篇章详细描述了HotSpot JVM。第4节描述了四种有效的垃圾回收器,对于每种回收器,第4节中都提供了其所应用的回收算法和指出选择对应的回收器。

第5节中描述了J2SE5.0发布版中的新技术,该技术展示了垃圾回收器和堆大小的自动选择,以及根据程序运行所在系统自动选择HotSpot JVM模式和根据用户配置动态调整垃圾回收,这项技术称为工效学(ergonomics)。

第6节中提供了一些选择和配置垃圾回收器的建议,同时也提供了产生内存溢出异常时应该怎么做的建议。第7节中描述了一些可以用来检测垃圾回收性能的工具,第8节中列出了一些经常用到的能够影响垃圾回收器选择和行为的命令行参数。

明确管理内存和自动管理内存对比

内存管理是指当已经分配的对象不再需要的时候被识别出来的过程,释放这些对象的内存并标识这些内存有效,可以用来循环使用。在一些程序语言中,内存管理是程序员的责任,这个责任的复杂在于内存管理经常引出很多普通的错误,这些错误会导致未预期或错误的程序行为和异常,为此,大部分的开发时间都用在调试和修复这些问题。

在程序中明确管理内存会经常发生的一个问题是悬挂引用(dangling references),在释放对象空间的时候很有可能还有一些对象在引用这个对象,如果对象的(悬挂)引用尝试访问原始对象,但这个空间已经被分配给一个新的对象了,那么就会导致不可预知的结果。

对于明确管理内存还有一个很常见的问题就是空间溢出,当内存已经分配并且不再引用但它并没有被释放时就会产生空间溢出,例如,你尝试释放链表的空间,但在释放链表的第一个节点时出了一点错误,那么链表的剩余节点将不再被引用,它们也不在程序可控制的范围内,同时它们也不再用和恢复。如果产生足够多的溢出,它们会一直占用内存,直到所有可用内存用完。

现在常用的内存管理方法中除了上面这个还有另一种方法,就是现在大多数现代面向对象语言中程序自动管理内存的垃圾回收器。内存自动管理可以增加接口的抽象和更可靠的代码。垃圾回收可以避免悬挂引用的问题,因为一个对象只要有引用就不会被回收,也不用考虑释放的问题,垃圾回收同时也解决了上面所说的空间溢出的问题,因为它自动释放不再引用的所有内存。

你可能感兴趣的:(JVM-优化,5)