当前位置: 首页 > 知识库问答 >
问题:

减少Java堆大小

朱兴学
2023-03-14

我有一个应用程序,它使用大量的内存来区分两个潜在的巨大(100k)目录的内容。对我来说,这样的操作会占用大量内存是有道理的,但是一旦我的 diff'ing 操作完成,堆的大小就会保持不变。

我基本上有实例化类的代码,用于存储源和目标上每个文件的文件名、文件大小、路径和修改日期。我将添加、删除和更新保存在其他数组中。然后,我clear()我的源数组和目标数组(现在可能每个都是100k),只剩下相对较小的添加、删除和更新数组

但是,在我清除()目标和源阵列后,内存使用情况(通过虚拟VM和Windows任务管理器可见)不会下降。我对VirtualVM(或任何分析器)没有足够的经验来弄清楚是什么占用了所有这些内存。VirtualVM 的堆转储列出了保留大小为几兆字节的前几个对象。

有什么可以帮助我指出正确的方向吗?

共有3个答案

艾焕
2023-03-14

根据您的代码,您可能会生成内存泄漏,垃圾收集器无法释放它们。

我建议检测您的代码以发现潜在的内存泄漏。一旦排除或修复了这一点,我将开始查看代码本身以进行可能的改进。

请注意,例如,如果您使用尝试/捕获/最终阻止。最终块可能根本不会被调用(或者至少不会立即调用)。如果你在最终块中做一些资源释放,这可能是答案。

尽管如此,还是阅读了这个主题,例如在这里:http://www.toptal.com/java/hunting-memory-leaks-in-java

赫连越
2023-03-14

VM根据命令行参数-XX:MinHeapFreeRatio和-XX:MaxHeapFree Ratio来增加或缩小堆。当空闲百分比达到-XX:MaxHeapFreeRatio时,它将收缩堆,默认值为70。

Oracle的bug#6498735对此进行了简短的讨论。

冯祺
2023-03-14

如果垃圾回收后使用的堆出现故障,那么它很可能会按预期工作。Java在需要更多内存时会增加堆,但不会释放它——它更喜欢保留堆,以防应用程序再次使用更多内存。请参阅不使用时是否有降低Java堆的方法?本主题的主题是,为什么在使用的堆数量减少后,堆没有减少。

 类似资料:
  • 这里和这里都有类似的问题,但对JVM参数的更改都没有让我找到相同的解决方案。我只是想减少JVM未使用的堆大小,以便它更接近实际使用情况(将其释放给操作系统)。我一直在使用YourKit来分析内存使用情况,它通常如下所示: 我正在运行智能Ij IDEA社区版64位,在Windows 7 64位,8 GB RAM上运行。我已经编辑了.文件在这里找到: 与上述链接中提到的建议。第一个链接的答案实际上是错

  • 问题内容: 我们将Java 6 JRE与我们的应用程序安装程序捆绑在一起,以便可以在任何计算机上运行,​​但这会使应用程序变得更重。因此,我们计划减小JRE的大小。如果有人完成了此类任务,您能否提供指导以继续前进? 问题答案: 查看JRE目录中的README文件。“可选文件和目录”部分列出了一些文件(如果将它们与应用程序打包在一起,可以从Oracle / Sun JRE中删除)。 创建安装时,我使

  • 问题内容: 我正在开发一个 Java Web应用程序 ,其中包括 一个applet 。该小程序依赖于两个jar文件: JFreeChart(用于在客户端绘制图) -1.7 mb(jar文件的大小) MySqlJdbcConnector(用于将在客户端捕获的数据存储到远程数据库)-. 7 mb(JAR文件的大小) 现在,问题是上述两个jar文件的大小。我的小应用程序jar (myApplet.jar

  • 我有一个在 上运行的 Java 应用程序。我观察到系统报告的Java进程的RSS使用率不断增加,它将达到超过90%的物理内存,即,我的代码将重新启动系统。另一方面,我从代码中定期打印出来的表明它总是在不超过物理内存37%的有限范围内波动(意味着 你知道发生了什么以及如何解决这个问题吗? 该系统是 板上的嵌入式 Linux。

  • 问题内容: 我有一个超过40MB的简单tomcat pyinstaller exe。 我的exe示例: 40MB +似乎有点矫kill过正。 如何尽可能减少这种情况? 一种方法: 但是考虑到排除列表的大小,这是不切实际的。 如何为pyinstaller选择一个文件夹,以从中获取模块并排除其他所有内容,所以我的应用程序可能很小? 规格文件: 这也值得一提。默认情况下,Pyinstaller不会检测到

  • 问题内容: 有什么办法可以减少jar文件的大小? 我想要一个减少未使用依赖性的工具。 我使用Maven进行依赖管理。 问题答案: 从Maven的角度来看,JAR文件通常不包含依赖项。因此,您必须在谈论: WAR或EAR或类似文件, 通过合并大量JAR文件而产生的所谓的UberJAR文件;例如使用Maven阴影插件,或 依赖比Maven模块更精细。 在前两种情况下,可以通过在依赖关系规范或war或s