Java 运行时堆栈内存

Java 运行时堆栈内存,java,memory,stack,Java,Memory,Stack,如何在运行时获得堆栈的最大内存。我的理解是Runtime.getRuntime().maxMemory()将提供堆内存。我想知道堆栈内存 p、 s:我已经将-xss设置为1m,我想测试一下,所以如果有比从运行实例本身获取更好的方法,我愿意接受建议 您可以使用JDK_HOME/bin/JConsole.exe中提供的JConsole来检查程序的统计信息。它将通过图形显示堆/非堆和详细的堆内存使用情况。这不是您通常关心的问题,因为您通常希望避免Java中的递归,因为使用循环通常更有效(例如Java没

如何在运行时获得堆栈的最大内存。我的理解是Runtime.getRuntime().maxMemory()将提供堆内存。我想知道堆栈内存


p、 s:我已经将-xss设置为1m,我想测试一下,所以如果有比从运行实例本身获取更好的方法,我愿意接受建议

您可以使用JDK_HOME/bin/JConsole.exe中提供的JConsole来检查程序的统计信息。它将通过图形显示堆/非堆和详细的堆内存使用情况。

这不是您通常关心的问题,因为您通常希望避免Java中的递归,因为使用循环通常更有效(例如Java没有尾部调用优化)

在Linux上,您可以通过阅读
/proc/self/maps
来解决这个问题,其中包含程序正在使用的所有内存映射,并且每个堆栈都有一个条目

e、 g.在本例中,您可以看到线程669和668的堆栈区域

7ff4617ee000-7ff4617f1000 ---p 00000000 00:00 0 
7ff4617f1000-7ff4618ef000 rw-p 00000000 00:00 0                          [stack:669]
7ff4618ef000-7ff4618f2000 ---p 00000000 00:00 0 
7ff4618f2000-7ff461bf0000 rw-p 00000000 00:00 0                          [stack:668]

这个十六进制范围的大小是
0xFE000
或1040384,几乎是1 MB。

非堆内存只是堆栈。我一直认为非堆包括直接内存、gui组件、,jvm用于内部处理等的内存。@PeterLawrey我也这么认为。@Vitthal我将通过thanx检查它。@PeterLawrey GUI组件也是对象,因此它们将相应地加载到堆中。对于JVM内部使用,例如加载类,它使用PermGen空间,这也是堆的保留部分。如果我错了,请纠正我在反序列化我无法控制的rmi对象时正在执行递归。我在Windows上,你可以通过递归来测量它,直到抛出一个StackOverflower错误,并计算这是多长时间。如果对已知大小(例如1MB)执行此操作,则可以估计它,例如,如果它递归2x,则可能为2MB左右。