相关疑难解决方法(0)

OpenJDK JVM是否会将堆内存返回给Linux?

我们有一个长期存在的服务器进程,很快就需要大量的RAM.我们看到,一旦JVM从操作系统获得内存,它就永远不会将其返回给操作系统.我们如何要求JVM将堆内存返回给操作系统?

通常,这些问题的接受答案是使用 -XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio.(参见例如 1,2,3,4).但是我们像这样运行java:

java -Xmx4G -XX:MaxHeapFreeRatio=50 -XX:MinHeapFreeRatio=30 MemoryUsage
Run Code Online (Sandbox Code Playgroud)

仍然在VisualVM中看到这个:

Visual VM内存使用情况

显然,JVM并不尊重,-XX:MaxHeapFreeRatio=50因为heapFreeRatio非常接近100%而且远不及50%.无需点击"执行GC"即可将内存返回给操作系统.

MemoryUsage.java:

import java.util.ArrayList;
import java.util.List;

public class MemoryUsage {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Sleeping before allocating memory");
        Thread.sleep(10*1000);

        System.out.println("Allocating/growing memory");
        List<Long> list = new ArrayList<>();
        // Experimentally determined factor. This gives approximately 1750 MB
        // memory in our installation.
        long realGrowN = 166608000; //
        for (int i = 0 ; i < realGrowN …
Run Code Online (Sandbox Code Playgroud)

java memory-management heap-memory

52
推荐指数
1
解决办法
2856
查看次数

有没有办法在不使用时降低Java堆?

我目前正在研究Java应用程序并努力优化其内存使用.据我所知,我正在遵循适当的垃圾收集指南.但是,即使不需要,我的堆似乎仍然处于最大大小.

我的程序每小时运行一次资源密集型任务,当一个人没有使用计算机时.此任务使用了相当大的内存块,但在任务完成后立即释放所有内存.NetBeans探查器显示内存使用情况如下所示:

Java程序内存使用情况

我真的很想在不使用时将所有堆空间都交还给操作系统.没有理由让我把它全部用掉,而程序甚至不会在至少一个小时内做任何事情.

这可能吗?谢谢.

java heap memory-management

51
推荐指数
3
解决办法
2万
查看次数

Java垃圾收集器 - 什么时候收集?

什么是垃圾收集器实际收集的时间?它会在一段时间后或在一定量的内存耗尽后发生吗?还是有其他因素吗?

java garbage-collection

46
推荐指数
4
解决办法
4万
查看次数