当前位置: 首页 > 面试题库 >

什么是Java内存管理最佳实践?

韦寒
2023-03-14
问题内容

我正在接管以前的开发人员的一些应用程序。当我通过Eclipse运行应用程序时,我看到内存使用率和堆大小增加了很多。经过进一步调查,我发现他们正在循环创建一个对象以及其他东西。

我开始经历并做一些清理。但是,我经历的时间越长,我就会遇到更多的问题,例如“这实际上会做什么?”

例如,他们没有在上述循环之外声明变量,而只是在循环中设置其值…而是在循环中创建了对象。我的意思是:

for(int i=0; i < arrayOfStuff.size(); i++) {
    String something = (String) arrayOfStuff.get(i);
    ...
}

String something = null;
for(int i=0; i < arrayOfStuff.size(); i++) {
    something = (String) arrayOfStuff.get(i);
}

我不正确地说底循环更好吗?也许我错了。

另外,在上述第二个循环之后,我将“ something”设置回null怎么办?这样可以清除一些记忆吗?

在这两种情况下,我都可以遵循哪些良好的内存管理最佳实践,这些最佳实践将有助于使我的应用程序中的内存使用率保持较低水平?

更新:

到目前为止,我感谢大家的反馈。但是,我并没有真正询问上述循环(尽管根据您的建议,我确实回到了第一个循环)。我正在努力寻找一些最佳实践,我会密切注意。“使用完集合后,将其清除”的内容。我只需要确保这些应用程序不会占用太多内存即可。


问题答案:

不要试图超越虚拟机。第一个循环是关于性能和可维护性的建议最佳实践。循环后将引用设置回null不能保证立即释放内存。当您使用最小范围时,GC将尽其所能。

(从用户的角度)详细介绍这些内容的书籍是有效的Java
2
和实现模式。

如果您想了解有关性能和VM内部的更多信息,则需要观看讲座或阅读Brian Goetz的书。



 类似资料:
  • 问题内容: 我刚开始学习Go,并通读现有代码以学习“其他人的做法”。在这种情况下,遍历使用go“工作区”,尤其是与项目依赖关系有关的地方。 在处理各种Go项目时,使用一个或多个Go工作区(即$ GOPATH的定义)的常见(或存在)最佳实践是什么?我应该期望有一个类似于我所有项目的中央代码存储库的Go工作区,还是在我处理这些项目时都明确将其分解并设置$ GOPATH(有点像python) virtu

  • 问题内容: 在Java桌面应用程序中存储密码的推荐方式是什么? 我希望用户只能输入一次凭证,而不会再次提示。 在个人项目中,我一直在使用Preferences API,但我假设这与以纯文本格式存储(安全方面)没有什么不同。 非常感谢 编辑: 非常感谢您的建议。毫无疑问,这似乎有些混乱,因为我可能还没有把问题弄清楚。 我将给出一个假设的情况: 假设我正在为远程数据库创建一个简单的前端,该前端使用用户

  • 问题内容: 处理和存储日期的最佳实践是什么,例如在企业Java应用程序中使用GregorianCalendar? 寻找反馈,我会将所有出色的答案合并为其他人可以使用的最佳实践。谢谢! 问题答案: 乔达就是要走的路。为什么呢 它具有比标准Date / Time API更强大,更直观的界面 日期/时间格式没有线程问题。java.text.SimpleDateFormat不是线程安全的(不是很多人都知道

  • 行为管理最佳实践 TODO

  • 问题内容: 我正在构建一个基于expressjs的应用程序,我想在其中记录所有事件。我可以找到温斯顿,这似乎很酷。无论如何,我正在寻找一种方法将其连接到我的expressjs应用程序。 我还想要在应用程序内部登录。我的要求不是那么简单,所以我想将所有内容记录在我的应用程序中(不仅是请求)。 我目前的情况: server.js (我想在此级别记录http请求) 路线/something.js con

  • 问题内容: 我已经和Docker玩了一段时间,在处理持久性数据时继续寻找相同的问题。 我创建我的文件并公开一个卷,或使用它[在容器中安装主机文件夹]。 我应该对主机上的共享卷应用什么权限? 我可以想到两种选择: 到目前为止,我已经授予所有人读取/写入访问权限,因此我可以从Docker容器写入该文件夹。 将用户从主机映射到容器,以便我可以分配更多的细化权限。不确定这是否可能,但尚未找到很多相关信息。