我们有一个长期存在的服务器进程,很快就需要大量的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中看到这个:
显然,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) 我有一个关于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) 我正在尝试找到在GAE上配置我的App实例的最佳方法.
我在GWT/GAEJ上运行Saas.我有少量高级用户全天使用该应用程序(而不是每天使用该应用程序的大量用户).
因此,我正在尝试找到配置我使用前端实例类的最佳方法,以使其最有效,并提供最佳的用户体验.
我已启用计费,并发现我需要运行空闲实例以避免实例启动时的延迟.我使用JDO,每次启动时,每个实例都需要很长时间来初始化数据存储访问.所以我启动了许多应用程序实例,让它们以空闲模式运行.这提供了很好的用户体验,但显然意味着我为那些闲置的实例付费 - 不理想.
我将调查是否可以更有效地做到这一点.
不过这是背景,我真正的问题如下; 如果我查看我的实例的内存使用情况,他们会经常说136MB等(它们的起始值约为66MB).所以我想我有一些内存泄漏要找.但具体来说我想知道:
我也使用Memcache,想必在上面的计算中考虑到这个内存?
我目前使用F1实例类,其内存大小为128MB.那么对于我的实例来说,这似乎意味着大约136MB的大小是什么意思呢?他们会一直运行得更慢,因为他们会一直交换到磁盘吗?出于这个原因,我会更好地运行单个F2实例而不是2个F1实例吗?
我发现即使我有2个空闲实例,GAE也会非常恼火地启动新实例.尽管我将最小延迟设置得非常高(7.5秒).我在文档中读到这个设置在使用空闲实例时效果不大,但是如何确保只使用空闲实例,而不需要启动新的(由于数据存储初始化问题,这总是会导致更长的延迟)上文提到的)?(并且通过更多实例时间增加了我的成本)
我误解了什么吗?非常感谢任何帮助.