我已将64位Weblogic JVM的最大堆大小设置为4gb。当我压力测试应用程序时,堆大小永远不会超过4Gb,但任务管理器中的java.exe最多可以消耗10 Gb。这种消费来自哪里?
答案 0 :(得分:0)
嗯,这可能有很多原因,其中没有一个是特别令人兴奋的。首先,如前所述,在“任务管理器”中,查看进程的详细信息,并确保查看工作集而不是内存提交大小(虚拟内存)。
然后,下面是JVM进程中的一些列表(从头顶开始),它不会被视为java堆,其他人可能能够添加到列表中(或者可能减去或详细说明):< / p>
但我同意你的意见,如果你真的在看工作装置,那听起来有点惊人。我们通常在高负载(Debian Linux)的32位树脂服务器上使用1-1.5 GB的非Java堆内存。
答案 1 :(得分:0)
程序的总使用/可用内存可以通过java.lang.Runtime.getRuntime();
在程序中获得。运行时有几种与内存相关的方法。以下编码示例演示了它的用法。
import java.util.ArrayList;
import java.util.List;
public class PerformanceTest {
private static final long MEGABYTE = 1024L * 1024L;
public static long bytesToMegabytes(long bytes) {
return bytes / MEGABYTE;
}
public static void main(String[] args) {
// I assume you will know how to create a object Person yourself...
List<Person> list = new ArrayList<Person>();
for (int i = 0; i <= 100000; i++) {
list.add(new Person("Jim", "Knopf"));
}
// Get the Java runtime
Runtime runtime = Runtime.getRuntime();
// Run the garbage collector
runtime.gc();
// Calculate the used memory
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Used memory is bytes: " + memory);
System.out.println("Used memory is megabytes: "
+ bytesToMegabytes(memory));
}
}