撤废Java神话之一[Java编程]
本文“撤废Java神话之一[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关于java程序员而言,垃圾汇集功效是一个非常大的帮忙,同时也是利用java语言的一个非常大的上风. 但是,实际情形应当是不能因为垃圾汇集可以排除无用的内存就不去考虑内存问题.这里要指明的是, 假如忽视这个问题,那么就会招致问题.
首先,在差别的JVM上垃圾汇集算法是差别的,因此,假如你想你的程序可以很好的运行在差别的JVM上,那么就不能依靠垃圾汇集的特定行为.垃圾汇集是一个非常活泼的研究问题,更好、更快并且更切确的汇集器总在实现中.
但是很多现代的垃圾汇集器都有着一样的问题.此中一个是当他们运行时并非老是释放全部那些可以被汇集的对象.
解析表明java编程中大多对象的生存期是短暂的,因此,关于需求提高性能的汇集器而言,他们会削减查抄那些具有较永生命的对象的频度,这个是根据大多对象具有较短的生存期,而那些生存期较长的对象常常会被持续引用,因此,没有必要在每次查抄时都去查抄这样的对象能否可以被回收.
要释放特定的对象的内存大概需求多次调用垃圾汇集.你可以通过调用System.gc办法倡议(注意是倡议)垃圾汇集器运行.恳求这个办法的后果普通招致垃圾汇集器举行一次完好的汇集.普通这个比VM调用垃圾汇集要更完好和完好,也会尽大概快的完成.假如程序员显式的调用System.gc,那么推论是有更多的时间做更多的工作(请注意是有更多的事情做更多的事情,这意味着将举行大量的查抄,还记得方才的有关对长短生命期对象的查抄的频度的改变吗?而不是真正完好的排除).在任何一种情形下(显式调用垃圾汇集和VM调用垃圾汇集)都不要假定全部可以被汇集的对象会真正的被汇集.
显式的调用System.gc有更大的机会完成完好的汇集,但不是保证会完成.
另一个程序员会碰到的麻烦是他们常常保持对那些不再需求的对象的引用.这将禁止垃圾汇集器释放该对象.
这种情形在你自己管理列表的时刻会发生.
考虑下面的ObjStack类.这个类利用push和pop办法管理仓库中的对象.两个办法都操纵索引,该索引指明仓库中下一个可用的位置.push办法存储对新对象的引用并增添索引值,而pop办法减小索引值并返回仓库最上面的元素.
实例一:没有精确切现pop办法的ObjStack
class ObjStack
{
private Object[] stack;
private int index;
public void push(Object o)
{
stack[index] = o;
index++;
}
public Object pop()
{
index-;
return stack[index];
}
//...
}
目前成立一个容量为10的对象,然后调用8次push办法向它增添对象,那么此时索引值为8.
目前考虑三次调用pop办法后发生什么?此时的索引值为5,但是请注意,除了这个索引值发生改变外仓库其实没有别的任何改变!
固然pop办法减小了索引值,但是实际上仓库仍旧保持着对那些对象的引用.调用pop办法常常意味着那些对象应当被汇集(大多情形是如此的,即便不是即刻,也是在稍后利用完该对象后).但是由于仓库仍旧保存有对该对象的引用,它就不能被汇集.这些对象只能在调用push后被替换才大概被汇集.精确的pop的实现以下:
public Object pop()
{
index-;
Object o = stack[index];
stack[index] = null;
return o;
}
在这个版本的pop办法中,当引用被返回后,仓库删除对他们的引用因此垃圾汇集器在今后可以回收他们.
在你自己的编码中,关于那些不需求的对象,不要在引用它们!程序的履行极大收到可用内存的影响,可用内存越少,那么垃圾汇集的履行次数越多,这将极大的毁伤性能.
以上是“撤废Java神话之一[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |