【问题标题】:Can Java's JConsole be used to automatically configure memory?Java的JConsole可以用来自动配置内存吗?
【发布时间】:2016-06-13 07:05:09
【问题描述】:

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

假设我有一个消耗内存的简单 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 吗?谢谢

【问题讨论】:

  • 您可以配置 Java 进程可以消耗多少内存作为启动命令行选项。我不认为这可以在运行时改变。 stackoverflow.com/questions/763295/…
  • 如果您担心 JVM 实例会占用您所有的操作系​​统内存,您可以使用 -Xmx64m 限制 JVM 的堆大小,您可以在其中替换 64m 以指定您自己的最大允许堆大小兆字节。

标签: java jmx jconsole


【解决方案1】:

您只能添加 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      有没有办法配置 JConsole 来阻止这个应用程序 消耗 X 量内存?

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


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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 2017-01-11
        • 1970-01-01
        相关资源
        最近更新 更多