Java技术,IBM风格: IBM Developer Kit简介 - 编程入门网
分配给给定对象,即使总内存是足够的。即使在内存看起来足够的情况下,这也会导致 OutOfMemoryError。
使用保守性收集器的另一个影响是需要对 Java 对象进行 pin 和 dose。当从 JNI(本机)代码引用对象时,它们就被 pin。当从 Java 堆栈或寄存器引用对象(有意或无意地成为保留的垃圾)时,对象就成为 dose 的。在垃圾收集器对 Java 对象进行紧凑排列期间,pin 和 dose 会阻止对象在 Java 堆上移动。这是因为在对象移动时,Java 堆栈和寄存器中的对象引用无法更新为对象的新位置;对于保留的垃圾,它实际上会变成一个不引用 Java 对象的值。 在垃圾收集的紧凑排列阶段,无法移动这些对象,这造成无法完全消除 Java 堆上对象的碎片化,因此留下了残留的碎片。这个问题造成在 Java 堆上即使看起来有足够的空闲内存,也无法分配对象,同时导致运行应用程序所需的 Java 堆比真正需要的大。 这两个问题都通过转移到类型精确的收集器(type-accurate collector) 解决了,这种收集器维护自己的经过良好描述的类型精确的堆栈。这避免了保留垃圾的问题,因为它知道一个值是否引用 Java 对象。因为能够编辑这些类型精确的堆栈,所以在紧凑排列期间对象可以移动了,因而消除了残留碎片问题。 并行收集器 紧凑排列是运行垃圾收集时最消耗时间的阶段。为了减少紧凑排列的时间,在 Java 5.0 技术的 IBM 实现中引入了并行紧凑排列(parallel compaction)。 并行紧凑排列允许多个线程帮助在 Java 堆上移动对象,从而将大量的小块空闲空间合并成少量的大块空间。实现的方法是,对于进程可以使用的每个 CPU,建立一个线程,并将 Java 堆分割成许多名义上的区域,这些线程分别负责每个区域的紧凑排列。 分代的并发收集器 分代并发(或称为 gencon)收集器利用了 “大多数对象在年轻时就死了” 这一并不可靠的假设,通过创建分成两代的 Java 堆来实现。通过将对象分成新老两代,收集过程可以主要关注年轻的对象。年轻(也称为婴儿(nursery)) 代使用一个半空间复制收集器,而老年(也称为长存的(tenured)) 代使用并发的标志扫描收集器。 消息 GC 日志记录更新 为了改进 GC 组件的 RAS 品质,GC 日志记录机制在两个方面进行了更新。日志记录器提供更详细的信息并采用 XML 格式而不是一般文本;由于第一次数据捕捉失败,所以它还将此数据的子集记录进内存中的缓冲区。 详细 GC 输出转移到基于 XML 的结构,因此更容易通过简单的 XML 读取器(比如 Web 浏览器)查看数据,也更容易通过各种详细 GC 分析工具进行分析。 内存中的跟踪缓冲区在发生失败时或者应用户的请求存储到文件,所以即使详细 GC 没有启用,它也可以提供关于 Java 内存使用情况和 GC 状态的基本信息,而且它大大提高了第一次失败数据捕捉信息的质量。 对 JIT 编译器的改进 尽管 Java 平台的用户对 JIT 编译器的内部不了解,但是它对 Java 运行时的应用程序执行性能影响很大。它在运行时将 Java 字节码转换为优化的机器码,从而大大提高了 Java 方法的运行速度。 从 1.4.2 到 5.0 版,许多改进和改变提高了 IBM JIT 编译器的性能,同时减小了 JIT 编译对正在运行的应用程序的影响。表 1 列出了主要的变化: 表 1. IBM JIT 编译器中的改进
|
||||||||||||||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |