Java的JConsole可以用来自动配置内存吗?

时间:2016-03-01 01:37:52

标签: java jmx jconsole

我正在研究Java JMXJConsole。我很好奇JConsole的内存管理能力。例如,“内存”选项卡中有一个“执行GC”按钮:

enter image description here

假设我有一个简单的Java应用程序来占用内存,如下所示:

public class MemoryEater
{
  public static void main(String[] args)
  {
    Vector v = new Vector();
    while (true)
    {
      byte b[] = new byte[1048576];
      v.add(b);
      Runtime rt = Runtime.getRuntime();
      System.out.println( "free memory: " + rt.freeMemory() );
    }
  }
}

是否有办法配置JConsole以防止此应用消耗X内存量?或者我需要通过JMX创建一个新的MBean?感谢

3 个答案:

答案 0 :(得分:3)

  

是否有办法配置JConsole以阻止此应用程序   消耗X量的内存?

从JConsole我们无法调整/控制内存限制。我看到的唯一选项是在启动java进程期间使用-Xmx。查看下面的屏幕截图,JConsole将内存参数公开为可读但不可写。

JConsole memory parameters readonly

  

或者我是否需要通过JMX创建一个新的MBean?

即使我们编写自己的MBean,我也不认为可以在运行时更改java进程的内存限制。唯一的方法是使用-Xms-Xmx在启动期间配置内存限制。

除非问题特定于您的示例代码,否则您希望限制可添加到VectorJMX Bean的元素数量,并限制内存消耗,这是可以,但我怀疑这是否是你正在寻找的。

答案 1 :(得分:0)

不,你不能。 Java内存管理是垃圾收集器和实际软件开发人员的责任。您可以使用不同的引用类型(如软引用)调整内存分配,调整GC参数和算法,或者尝试使用JMX或jcmd GC.run 实用程序命令强制进行GC调用。但是你无法改变运行JVM的内存边界或为堆占用设置高水位标记。

如果您需要另外的Java内存管理策略,请查看Terracotta BigMemory等产品。

答案 2 :(得分:0)

你只能添加MBean函数并在JConsole中调用它们 - 在操作下。

public void add(){
   byte b[] = new byte[1048576];
   v.add(b);
   Runtime rt = Runtime.getRuntime();
   System.out.println( "free memory: " + rt.freeMemory() );
}

https://docs.oracle.com/javase/tutorial/jmx/mbeans/standard.html