加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JVM向OS发回内存

发布时间:2020-12-15 07:37:51 所属栏目:Java 来源:网络整理
导读:参见英文答案 Does GC release back memory to OS?????????????????????????????????????5个 我有一个关于JVM内存管理的问题(至少对于SUN的内存管理问题). 我想知道如何控制JVM将未使用的内存发送回OS(在我的情况下为Windows)这一事实. 我写了一个简单的java
参见英文答案 > Does GC release back memory to OS?????????????????????????????????????5个
我有一个关于JVM内存管理的问题(至少对于SUN的内存管理问题).

我想知道如何控制JVM将未使用的内存发送回OS(在我的情况下为Windows)这一事实.

我写了一个简单的java程序来说明我的期望.
使用-Dcom.sun.management.jmxremote选项运行它,以便您也可以使用jconsole监视堆.

使用以下程序:

package fr.brouillard.jvm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;

public class MemoryFree {
    private BufferedReader reader = new BufferedReader(new
        InputStreamReader(System.in));
    private List<byte[]> usedMemory = new LinkedList<byte[]>();
    private int totalMB = 0;
    private int gcTimes = 0;

    public void allocate(int howManyMB) {
        usedMemory.add(new byte[howManyMB * 1024 * 1024]);
        totalMB += howManyMB;
        System.out.println(howManyMB + "MB allocated,total allocated: " +
                totalMB + "MB");
    }

    public void free() {
        usedMemory.clear();
    }

    public void gc() {
        System.gc();
        System.out.println("GC " + (++gcTimes) + " times" );
    }

    public void waitAnswer(String msg) {
        System.out.println("Press [enter]" + ((msg==null)?"":msg));
        try {
            reader.readLine();
        } catch (IOException e) {
        }
    }

    public static void main(String[] args) {
        MemoryFree mf = new MemoryFree();
        mf.waitAnswer(" to allocate memory");
        mf.allocate(20);
        mf.allocate(10);
        mf.allocate(15);
        mf.waitAnswer(" to free memory");
        mf.free();
        mf.waitAnswer(" to GC");
        mf.gc();
        mf.waitAnswer(" to GC");
        mf.gc();
        mf.waitAnswer(" to GC");
        mf.gc();
        mf.waitAnswer(" to GC");
        mf.gc();
        mf.waitAnswer(" to exit the program");

        try {
            mf.reader.close();
        } catch (IOException e) {}
    }
}

一旦完成第一个GC(预期的内容),内部堆就会自由,但内存只会从第三个GC开始发送回操作系统.在第四个之后,将完全分配的内存发送回OS.

如何设置JVM来控制此行为?
实际上我的问题是我需要在服务器上运行几个CITRIX客户端会话,但我希望服务器上运行的JVM尽快释放内存(我的应用程序中只有很少的高消耗内存函数).

如果无法控制此行为,我是否可以像这样使用并增加操作系统虚拟内存,让操作系统按需使用它而不会出现大的性能问题.
例如,在4GB服务器上有10个java进程的1GB内存(在堆中只有100MB实际分配的对象)当然会有足够的虚拟内存.

我猜其他人已经遇到过这样的问题/问题.

谢谢你的帮助.

解决方法

要控制堆返回到OS,从Java 5开始,使用-XX:MaxHeapFreeRatio选项,如 tuning guide中所述.

如果您认为您的问题与this one有意义的不同,请指出如何.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读