3 回答
TA贡献1803条经验 获得超3个赞
取决于您的 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
TA贡献1891条经验 获得超3个赞
未使用的内存是浪费的内存。
为什么要显式调用System.gc()
. 恕我直言,您永远不应该调用它并让 JVM 来决定何时运行 GC。(如果您是新手,JVM 可以做出比您更好的决定。System.gc()
只有在您真正知道自己在做什么时才调用。)调用System.gc()
.
System.gc()
只是对 JVM 运行 GC 的请求/提示。这绝不意味着 GC 肯定会运行。
您可以在 Java 中出现内存泄漏,但这肯定不是您需要考虑的问题,因为正如您在调用时提到的那样,System.gc()
您可以看到一些内存被释放。(所以不是你仍然持有未使用对象的引用,这会阻止 GC 清理这些对象。)
为什么你认为你的代码有问题?可能不需要更多内存,或者如果需要内存,你已经有足够的内存了(用外行的话来说,GC 不会释放内存,因为程序还有很多东西可以运行 -那么GC为什么要清理内存呢?)。
TA贡献1828条经验 获得超4个赞
没有办法强制JVM释放内存,System.gc()
只是一个提示。由 GC 来管理内存(请注意有各种类型的内存,例如堆、元空间、堆外)。每个 GC 算法都有多个可以调整的配置参数,但它们都不会给您提供按需释放内存的选项。
JVM 在启动时保留内存并从操作系统请求额外的内存,直到达到配置的任何限制。它以块增量的方式进行,一次请求 MB 或更多内存,因为从操作系统逐字节请求内存效率非常低。
添加回答
举报