当前位置: 首页 > 知识库问答 >
问题:

如何获得Java进程的最大堆大小?

严阳秋
2023-03-14

我想检查我的应用程序是否很好地获得-xmx选项。

java进程在docker容器中运行。

为了做到这一点,我要找到所创建进程的最大堆大小。

bash-4.2$ jmap -heap 128
Attaching to process ID 128, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 128: Operation not permitted
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 128: Operation not permitted
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:163)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:278)
        at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)
        at sun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611)
        at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337)
        at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
        at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
        at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
        at sun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:49)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.tools.jmap.JMap.runTool(JMap.java:201)
        at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 128: Operation not permitted
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access$100(LinuxDebuggerLocal.java:62)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$1AttachTask.doit(LinuxDebuggerLocal.java:269)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)
    null

假设(ngcmx+ogcmx)=(-xmx value)可以吗?

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

共有1个答案

郎献
2023-03-14

您可以使用jcmd工具:

 jcmd <you_vm_process_id> VM.flags | grep MaxHeapSize

这将显示最大堆(即使您没有自己设置)

 类似资料:
  • 问题内容: 如何从Java程序中获取VM的最小和最大堆大小设置? 问题答案: 最大堆大小: 您可能会发现一些有趣的其他计算:

  • 问题内容: 我试图以编程方式找出用于调用我的程序的JVM的最大permgen和最大堆大小,而不是它们当前可用的大小。 有没有办法做到这一点? 我熟悉Java Runtime对象中的方法,但不清楚它们真正提供了什么。 或者,是否有办法询问Eclipse为这两个分配了多少? 问题答案: 试试这个: 但是它们仅提供快照数据,而不提供累积值。

  • PS:有时我会从java代码执行shell脚本。会不会导致这类问题?

  • 问题内容: 如何获取BigDecimal变量可以容纳的最大可能值?(最好以编程方式,但也可以进行硬编码) 编辑 好,因为BigDecimal是任意精度,所以才意识到没有这种事情。因此,我最终得到了这个结果,它对于我的目的来说足够大: 问题答案: 它是一个任意精度的类,它将达到您想要的大小,直到您的计算机内存不足。

  • 我刚刚在VServer和JRE Build1.7.0_67-B01上安装了Ubuntu 64bit。如果我想运行一个java jar文件,它说 无效的最大堆大小:-XMX错误:无法创建Java虚拟机。错误:发生致命异常。程序将退出。 我试了1M,256M,1024M,2G和4G的-XMX,都不起作用。是不是有我不知道的隐藏设定? 下面是我使用的命令:

  • 问题内容: 我正在使用Ubuntu 11.04。如何找出进程的最大调用堆栈大小以及堆栈中每个帧的大小? 问题答案: 您可以使用查询最大进程和堆栈大小。堆栈框架没有固定的尺寸。它取决于每个帧需要多少本地数据(即本地变量)。 要在命令行上执行此操作,可以使用ulimit。 如果要为正在运行的进程读取这些值,我不知道执行此操作的任何工具,但是查询/ proc文件系统很容易: