null在Java中分配未使用的对象引用是否以任何可测量的方式改进了垃圾收集过程?
我用Java语言(C#)的经验告诉我,经常是反直觉的,试图智取虚拟机或JIT编译器,但我已经看到同事用这个方法,我很好奇,如果这是一个很好的做法挑向上或那些巫术迷信编程的一个?
我正在接管以前开发人员的一些应用程序.当我通过Eclipse运行应用程序时,我看到内存使用情况和堆大小增加了很多.经过进一步调查,我发现他们正在循环中创建一个对象以及其他东西.
我开始经历一些清理工作.但是我经历的越多,我就越想问"这实际上会做什么吗?"
例如,不是在上面提到的循环之外声明变量而只是在循环中设置它的值......它们在循环中创建了对象.我的意思是:
for(int i=0; i < arrayOfStuff.size(); i++) {
String something = (String) arrayOfStuff.get(i);
...
}
Run Code Online (Sandbox Code Playgroud)
与
String something = null;
for(int i=0; i < arrayOfStuff.size(); i++) {
something = (String) arrayOfStuff.get(i);
}
Run Code Online (Sandbox Code Playgroud)
我不正确地说底部循环更好吗?也许我错了.
另外,在上面的第二个循环之后,我将"某些东西"设置为null?这会清除一些记忆吗?
在任何一种情况下,我可以遵循哪些良好的内存管理最佳实践,这将有助于在我的应用程序中保持低内存使用率?
更新:
到目前为止,我感谢每个人的反馈.但是,我并没有真正询问上面的循环(尽管根据你的建议,我确实回到了第一个循环).我正在努力获得一些我可以留意的最佳实践."当你完成使用Collection时,清除它"的界限.我真的需要确保这些应用程序不会占用太多内存.
我试图找到sun java vm的内存段的解释,这也是管理员可以理解的.它应该解释堆/非堆内存是什么以及不同内存池的重要性.
如果它以某种方式与jconsole视图相关,那将是一个奖励.
有网站有这样的解释吗?
我倾向于通过学生或寻找资源的同事提出这些问题,所以我想要更明确的参考.不妨与社区分享.
Java内存模型是如何表示的,它的特征是什么?
垃圾收集如何在一般和最常见的JVM中工作?
如何测试和调整Java应用程序的性能?
我有一个简单的问题.在下面的代码中,为什么s3的值仍然打印,尽管之前我将它设置为null.似乎gargbage收集器不会被调用.
public class Test {
public static void main(String[] args) {
String s1 = "abc", s2 = "def", s3 = "ghj";
String sarr[] = {s1, s2, s3};
s3 = null;
System.gc();
for(int i = 0; i < sarr.length; i++) {
System.out.print(sarr[i] + " "); //prints abc def ghj
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法将不胜感激.
您可以通过调用简单地在Java中进行垃圾收集,System.gc()但有时这会"拖延"应用程序.像这样垃圾收集并避免失速是一个坏主意:
new Thread(new Runnable() {
public void run() {
System.gc();
}
}).start();
Run Code Online (Sandbox Code Playgroud)
或者这可能导致更多问题?