论坛首页 Java企业应用论坛

java也许需要栈对象和对象分组管理....

浏览 2417 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-06  
GC是java的优点,但在某些情况下也会成为java的缺点,特别是在内存的使用与GC策略不相符的时候。这些时候,我们一般会采用池化或者其他可以避免完全使用GC策略的方法来解决问题。但是这类的解决方法一般代价都会比较大。我们需要考虑新的方案来提升GC在这方面的性能。

那么为什么不能用显式的释放方案呢?因为如果添加入显式的释放方法的话,那么就会迫使java所有的对象也需要添加上显式的释放方法(你总不会希望释放自己对象的时候,对象内部的基本对象不会随之释放吧)。这样既破坏了java的体系结构,也使java失去了不会出现空指针的优点。所以,GC还是必须GC,我们必须寻找更好的策略来解决GC的弱点。

在应用中,经常会出现一次性对象这样对象,这类对象的特点是初始化一次,使用一次,然后等待被GC释放。这样的对象对于GC来说会是沉重的负担。因为GC对于这样的对象也必须查找一次引用。如果这类对象数量巨大,GC的时间将会相当的长。

在C或者C++中,我们通常在这种情况下把结构或者对象本身存储在栈中(而java是只储存指针)。我很奇怪为什么java不也这样做。哪怕是专门分配一个heap给栈中创造的对象也是好的。这样我们就能够轻易的指定一个对象的生存期,也能大大降低GC的压力。

另外,我们是否能考虑一种能够分組控制对象的方法。对组内对象的引用计数一律记载入组而不是记载在对象内。仅当组引用为0时再一次性的清除掉组内所有。这样理论上就会大大减少GC需要查询引用的数量。

以上两种方案都必须修改编译器以及jvm的实现才能做到。所以现在实现的可能还是非常的低。不过我认为如果实现,将会大大改善java在高性能应用中的不足。

   发表时间:2008-11-06   最后修改:2008-11-06
如果这样改,那你为什么不直接用cpp? C++ 0x都要引入GC了
0 请登录后投票
   发表时间:2008-11-06  
cpp和java,我一般都是混用的...呵呵
谁叫java能力弱呢
0 请登录后投票
   发表时间:2008-11-06   最后修改:2008-11-06
JVM在Java 7中据说将加入内存逃逸分析,对于非逃逸行对象采用运行栈分配的方法。
比如:
void doSomething(){
    A a = new A();
    a.doOtherthing();    
}

这个方法产生的对象a是非逃逸的,Java 7的虚拟机可以检测这种对象的生成,将new A的对象放在运行时栈上产生。这种方法有很大的好处,开发人员不需要显示的声明某个对象是栈式分配,和以前的编程方式没有任何区别,又大大提升了内存管理效率。
0 请登录后投票
   发表时间:2008-11-06  
关于java内存管理的问题,随着版本的变化也在不段地优化,更何况有一些更高效的jvm可选择。
1 请登录后投票
   发表时间:2008-11-06  
dennis_zane 写道
如果这样改,那你为什么不直接用cpp? C++ 0x都要引入GC了


据闻c++0x最新定下的草案取消了直接的GC支持

引用
Transparent garbage collection
C++0x will not feature transparent garbage collection directly. Instead, the C++0x standard will include features that will make it easier to implement garbage collection in C++.
Full garbage collection support has been remanded to a later version of the standard or a Technical Report.

http://en.wikipedia.org/wiki/C%2B%2B09#Transparent_garbage_collection


0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics