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

强制JVM释放内存

羿昊英
2023-03-14

我改进了代码,以便从垃圾收集器中获得更好的结果。

现在,当我调用System.gc()时,它确实释放了所有内存。但是,当我在不调用 System.gc() 的情况下观察内存使用情况时,应用程序确实会保留并使用越来越多的内存。

这是否意味着我的改进正在起作用,我的所有引用都是正确的,我可以忽略JVM是如何自己释放内存的。或者,我的代码中是否存在其他问题,这些问题是JVM在不运行垃圾收集器的情况下保留更多内存的原因。

共有3个答案

郤瀚
2023-03-14

没有办法强制JVM释放内存,System.gc()只是一个提示。由GC来管理内存(请注意,有各种类型的内存,例如堆,元空间,堆外)。每个 GC 算法都有多个配置参数,您可以调整这些参数,但两者都不会为您提供按需释放内存的选项。

JVM在启动时保留内存并从操作系统请求额外的内存,直到它达到配置的任何限制。它以块增量执行,一次请求MB或更多内存,因为逐个字节地从操作系统请求内存将非常低效。

柳项明
2023-03-14

未使用的内存是浪费的内存。

为什么要显式调用System.gc()。恕我直言,你永远不应该调用它,让JVM来决定何时运行GC。(如果你是新手,JVM可以做出比你更好的决定。只有当你真正知道自己在做什么时,才调用System.gc()。)调用System.gc()通常是一种不好的做法。

< code>System.gc()只是JVM运行gc的一个请求/提示。这并不意味着GC一定会运行。

Java中可能存在内存泄漏,但在您的情况下肯定不会出现这种情况,因为正如您在调用<code>系统时提到的那样。gc()您可以看到一些内存正在被释放。(因此,您仍然持有未使用对象的引用,这可能会阻止GC清理这些对象。)

为什么你认为这是你的代码有问题?可能是不需要进一步的内存,或者如果需要内存,您已经拥有了足够的内存(通俗地说,GC不会释放内存,因为程序仍有很多东西需要运行 - 那么为什么GC要费心清除内存?

范承望
2023-03-14

取决于JVM正在使用的GC。如果它是JDK9,那么它可能是G1,在内存消耗方面是“贪婪的”,因此,根据您检查内存使用情况的方式,它可能看起来好像占用了大量内存(这是保留内存并动态/按需使用/释放)。

你可以用

https://docs . Oracle . com/javase/8/docs/technotes/tools/UNIX/jstat . html

检查内存消耗。

至于GC和内存消耗分析,请查看以下内容:G1垃圾回收器的高内存使用率问题 https://www.javacodegeeks.com/2017/11/minimize-java-memory-usage-right-garbage-collector.html

 类似资料:
  • 本文向大家介绍Shell实现强制释放内存脚本分享,包括了Shell实现强制释放内存脚本分享的使用技巧和注意事项,需要的朋友参考一下 公司服务器最近两天老是因为内存被使用满而造成死机,实在是受不了老叫机房的人去帮忙重启,专门写了个脚本来释放下内存,当然这台服务器不是太重要,我粗鲁的处理方式估计不会适合大多数服务器,请大家使用之前先考虑清楚,不然造成数据丢失就不关我的事了. 脚本内容: cat che

  • 问题内容: 我正在阅读Python内存管理,希望减少应用程序的内存占用。有人建议,子流程可以大大减轻该问题;但是我在概念上需要做些麻烦。可以请一个简单的例子说明如何解决这个问题。 …变成一个 真正的 子处理函数,该函数不存储额外的“自由列表”? 奖励问题: 这个“自由列表”概念也适用于python c扩展吗? 问题答案: 关于优化建议的重要事项是确保仅在子流程中调用该建议。该和是无关的- 一旦你在

  • 我是分析Java记忆问题的新手。所以请原谅我这个问题看起来很天真 我在运行应用程序时设置了以下JVM参数: 我正在使用visualVM监控使用情况:以下是我看到的 问题是,即使应用程序没有接收任何要处理的数据,使用的内存也不会下降。当应用程序启动时,使用的空间开始变小(大约1GB),但随着应用程序的运行而增加。然后用过的记忆永远不会消失。我的问题是,为什么即使应用程序中没有发生重大处理,使用的堆内

  • 我将EclipseLink与JTA一起使用。当我使用WebLogic server版本(12.2.1.3.0)运行应用程序时,遇到了以下问题 PS-WebLogic版本(12.2.1.2.0)不面临此问题

  • 我正在为我的应用程序使用GC选项。 由于大多数人都已经体验过JVM擅长将堆增加到最大堆大小,但它不会将内存释放回操作系统。我遇到了

  • 我们有一个简单的微服务设置,基于Windows服务器上的Spring Boot和Java8。 许多服务的负载很低,因为它们是与各种外部合作伙伴的集成。所以它们很多时候都是空闲的。 问题在于,JVM 仅在触发垃圾回收时才会将内存释放回操作系统。因此,服务可能会开始使用32mb,然后为单个请求提供服务并分配2GB内存。如果该服务上没有其他活动,则不会受到 GC 和服务器上的其他服务的影响。 使用Sys