在JRE中查找堆大小

时间:2014-05-02 17:15:07

标签: java memory-management heap

我有linux系统,其中我有一个JVM,它由3个java进程使用。

/home/codesrc>java -version
          java version "1.7.0_09"
          Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
          Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

因此,我使用相同的JRE运行3个进程。 当进行像

这样的操作时,每个进程都有自己的命令行定义的内存
java -Xms256m -Xmx1024m -cp $CLASSPATH <class name>
java -Xms256m -Xmx512m -cp $CLASSPATH <class name>
java -Xms256m -Xmx705m -cp $CLASSPATH <class name>

linux系统上的内存为4GB。我试图分别为每个进程找到堆使用情况。由于我在系统上没有JDK,因此我无法使用jmap,jconsole或jstack。 我试过了

Runtime.getRuntime().totalMemory()

但这并没有给我基于流程,而且上面的输出也没有看到 任何人都知道如何仅在使用JRE时检查堆使用情况,这与

相当
jmap -heap <PID>

2 个答案:

答案 0 :(得分:2)

当您在服务器上启动Java VM并使用enable the JMX agent可用于连接的主机时,最好的选择是JConsole

或者,您可以使用使用JMX检索详细信息的本地应用程序(see other question):

List memBeans = ManagementFactory.getMemoryPoolMXBeans();           
for (Iterator i = memBeans.iterator(); i.hasNext(); ) {

    MemoryPoolMXBean mpool = (MemoryPoolMXBean)i.next();
    MemoryUsage usage = mpool.getUsage();

    String name = mpool.getName();      
    float init = usage.getInit()/1000;
    float used = usage.getUsed()/1000;
    float committed = usage.getCommitted()/1000;
    float max = usage.getMax()/1000;
    float pctUsed = (used / max)*100;
    float pctCommitted = (committed / max)*100;

}

答案 1 :(得分:2)

您正在寻找正在运行的进程的当前内存使用情况?你试过以下这个吗?

Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()