相关疑难解决方法(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
查看次数

JVM将内存发送回OS

我有一个关于JVM内存管理的问题(至少对于SUN的内存管理问题).

我想知道如何控制JVM将未使用的内存发送回操作系统(在我的情况下为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(); …
Run Code Online (Sandbox Code Playgroud)

java jvm memory-management

19
推荐指数
2
解决办法
1万
查看次数

理解GAEJ上的内存使用和前端实例类

我正在尝试找到在GAE上配置我的App实例的最佳方法.

我在GWT/GAEJ上运行Saas.我有少量高级用户全天使用该应用程序(而不是每天使用该应用程序的大量用户).

因此,我正在尝试找到配置我使用前端实例类的最佳方法,以使其最有效,并提供最佳的用户体验.

我已启用计费,并发现我需要运行空闲实例以避免实例启动时的延迟.我使用JDO,每次启动时,每个实例都需要很长时间来初始化数据存储访问.所以我启动了许多应用程序实例,让它们以空闲模式运行.这提供了很好的用户体验,但显然意味着我为那些闲置的实例付费 - 不理想.

我将调查是否可以更有效地做到这一点.

不过这是背景,我真正的问题如下; 如果我查看我的实例的内存使用情况,他们会经常说136MB等(它们的起始值约为66MB).所以我想我有一些内存泄漏要找.但具体来说我想知道:

  1. 我也使用Memcache,想必在上面的计算中考虑到这个内存?

  2. 我目前使用F1实例类,其内存大小为128MB.那么对于我的实例来说,这似乎意味着大约136MB的大小是什么意思呢?他们会一直运行得更慢,因为他们会一直交换到磁盘吗?出于这个原因,我会更好地运行单个F2实例而不是2个F1实例吗?

  3. 我发现即使我有2个空闲实例,GAE也会非常恼火地启动新实例.尽管我将最小延迟设置得非常高(7.5秒).我在文档中读到这个设置在使用空闲实例时效果不大,但是如何确保只使用空闲实例,而不需要启动新的(由于数据存储初始化问题,这总是会导致更长的延迟)上文提到的)?(并且通过更多实例时间增加了我的成本)

我误解了什么吗?非常感谢任何帮助.

google-app-engine

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