2016-03-01 45 views
8

我正在研究关于Java JMXJConsole。我很好奇JConsole的内存管理能力。例如,有一个“执行GC”按钮,在内存选项卡:Java的JConsole可以用来自动配置内存吗?

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以防止此应用程序消耗内存数量的方法?还是需要通过JMX制作新的MBean?谢谢

+2

您可以配置Java进程能有多少内存消耗为启动命令行选项。我不认为这可以在运行时改变。 HTTP://计算器。com/questions/763295/setting-jvm-heap-size-at-running – Thilo

+1

如果您担心JVM实例占用了所有操作系统内存,则可以使用-Xmx64m限制JVM的堆大小,以便替换64m以兆字节为单位指定您自己的最大允许堆大小。 –

回答

3

会有一种方法来配置JConsole,以防止这个应用程序从 消耗X量的内存?

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

JConsole memory parameters readonly


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

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

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

0

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

如果您需要Java中内存管理的另一个策略,请查看Terracotta BigMemory之类的产品。

相关问题