Java进程内存检查测试

标签 java memory

我试图查看 -Xmx-Xms 参数如何影响我的程序并检查我的进程消耗了多少内存。

我编写了一个简单的程序,但无法推断出结果。请帮忙。

public static void main( String[] args ) {
        char[] array = new char[69926904];
}

我使用参数 -Xms5M -Xmx200M 运行。理想情况下,由于一个字符占用 2 个字节,因此它应该在超过内存限制之前保存 100M 个字符。即使我们说 pointerlength 使用的空间很少,我也不知道为什么在 69926904 长度。

谢谢。

最佳答案

仔细阅读JVM Garbage Collection Tuning Guide关于世代堆,它有望回答您的问题。

使用 -XX:+PrintGCDetails 选项运行 Java,一切都会变得清晰:

Heap
 PSYoungGen      total 3584K, used 294K [0x00000000fbd60000, 0x00000000fc160000, 0x0000000100000000)
  eden space 3072K, 9% used [0x00000000fbd60000,0x00000000fbda9860,0x00000000fc060000)
  from space 512K, 0% used [0x00000000fc0e0000,0x00000000fc0e0000,0x00000000fc160000)
  to   space 512K, 0% used [0x00000000fc060000,0x00000000fc060000,0x00000000fc0e0000)
 PSOldGen        total 136576K, used 136576K [0x00000000f3800000, 0x00000000fbd60000, 0x00000000fbd60000)
  object space 136576K, 100% used [0x00000000f3800000,0x00000000fbd60000,0x00000000fbd60000)
 PSPermGen       total 21248K, used 2595K [0x00000000ee600000, 0x00000000efac0000, 0x00000000f3800000)
  object space 21248K, 12% used [0x00000000ee600000,0x00000000ee888db0,0x00000000efac0000)

您的 200M Java 堆由 2 代组成:1/3 (66.7M) 是 YoungGen,2/3 (133.3M) 是 OldGen。

-XX:NewRatio 选项允许改变比例,但默认值为 2 表示 YoungGen 将保留 1/(2+1) 部分堆。

Java 对象不能跨代,因此对象的最大大小不能大于最大代。在您的情况下,最大的一代是 OldGen:136576K = 139853824,这正是 char[69926904] 的大小(16 字节 header + 2 * 69926904 字节数据)。

关于Java进程内存检查测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24202523/

相关文章:

java - 如何增加 Eclipse ADT Bundle 的 Java 堆空间

java - Rest api 上的条件验证

java - GWT 发送到远程服务器?

algorithm - 如何将网页浏览量与内存峰值相关联?

arrays - 使用 [..] (slice) 方法引用数组时,Ruby 会创建副本吗?

linux - 什么被认为是缓存中的高未命中率/低命中率?

java - 将特定长度的字符数组转换为字符串

java - 正则表达式删除两个单词之间的停用词

java - H2 + Hibernate 与不可空字符串存储空字符串

c - c中main函数中初始化的变量存储在哪里?