这也就意味着用户不再需要充分了解他们应用程序系统的内存需求。相反地,他们可以相信JVM内存系统可以根据应用程序的需求调整堆大小。缩减和扩展通常由堆的使用情况决定。这一特性的发展同时也需要考虑到其他应用程序的内存需求或者JVMs的运行以及应用程序的权限。如果内存的需求突然增加,堆尺寸将动态增长。相反,如果内存需求减少,那么JVM可能会考虑减少Java 堆的尺寸。
在一些系统中,应用程序可能会在某些特定的点上处于闲置状态,对于这样的系统考虑应用程序的权限是十分有用的。当权限较低的应用程序进入睡眠状态时,Java 堆可能会暂时收缩,在可能的情况下为权限更高的应用程序提供更多的可用内存。
动态垃圾回收
在运行时,更改垃圾回收机制是另一个已经实现的特性,利用这个特性可以增加BEA WebLogic JRockit内存管理系统的灵活性。某个垃圾回收策略对应用程序运行的某个阶段来说是最优的,那么对于另外一个阶段可能会有另一个机制是最优的。通过让JVM决定在每个垃圾回收点上使用哪个垃圾回收机制,可以获得更好的性能。通过使用这个自动配置垃圾回收器的特性可以实现在运行时动态改变垃圾回收策略,因此理论上不再需要用户设置启动选项的标志:
-Xgc: [gencon | singlecon | parallel]
另一个可以增加垃圾回收动态特性的方法是自动化nursery管理。在某些情况下,某个nursery可能在一个应用程序的整个运行过程中都没有用到。因此可以在需要时再将一个nuersery置为使能状态以此进一步提高性能。用户不再需要理解垃圾回收机制的内部工作原理就可以获取最优的应用程序性能。
由于这一特性仍处在实验阶段,用户目前只能通过使用启动选项标志实现适应性的垃圾回收系统。
-Xgcprio: [throughput | pausetime]
我们需要设置优先级为垃圾回收系统提供信息,告诉它当前什么是更重要的:短期的中断(中止时间)还是最大可能的吞吐量。
智能压缩
系统碎片是系统性能的另一个绊脚石。比如,离散在Java堆的小的空闲内存碎片可能引起内存分配失败,尽管在理论上当前的空闲内存可能可以满足分配的需要。
通过压缩可以防止碎片产生,并且这种方法已经使用了相当长的时间。压缩意味着压缩已经分配的内存碎片到Java堆的特定区域中,以便可以释放更大的连续内存空间。
关于Java堆中的哪些区域需要被压缩的启发式算法已经重新设计并且得到了改进,但是目前还没有实现。以前,以某种预定义的顺序决定压缩区域。当然,这的确可以减少碎片,但是使用这种方法即使压缩失败也会耗费很多时间,因为一个不包括任何碎片的区域也可能会被选作压缩对象。新的方法是根据开销的应用程序配置数据决定需要进行压缩的区域,这些应用程序配置数据通常可以反映出哪些区域最有压缩价值。另一个已经设计完成但是尚未实现的改进方法是根据应用程序决定压缩面积的大小。在那些碎片已经成为问题的应用程序系统中,这些新的特性实现代替了明确设置压缩区域大小或者压缩率的需要。
展望未来
现在,内存管理发展的一个主要方向就是实现,改进并且探索自调优特性。全面目标是通过去除启动选项开销简化系统,同时保持高性能。
进一步考虑发展标准,可能会发现其他一些解决时间消耗和费用开销的问题,比如,动态改善启发避免最坏情况。下一代JVM将吸取原来的经验并且分析运行状况而不断改善性能。
再深入考虑一下,可以设想JVM可以查找错误并且自动分析和创建错误报告,发送他们到相关的接收者。最后设想JVM可以针对每个不同的应用系统,自动地实现启发式优化,而不再需要指定任何一个启动选项标志。
结束语
正如前面所提到的,今天,客户从技术上使用先进的JVM的主要目标是尽可能简单高效的优化性能。
为了实现这个目标,为BEA WebLogic Jrockit设计的自调优内存管理系统可以维护通过强有力的调优获取的高性能,同时减少了调优的复杂性以及用户的开销和工作量。
通过解除用户的负担,不再需要他们了解内存管理系统的内部工作原理决定调优决策,在获得系统简便的同时,也实现了一个更加灵活的运行系统,在应用程序的整个生命周期,运行系统都会参考应用程序的各种需求和变化。 打破了实现高效调优和保持操作简便之间的冲突。