【问题标题】:In Java, is it possible to increase the JVM's available memory and/or kill other Java programs?在 Java 中,是否可以增加 JVM 的可用内存和/或杀死其他 Java 程序?
【发布时间】:2013-06-16 18:51:09
【问题描述】:

我对高级 Java 缺乏经验,请多多包涵。

我对 Java 实现可称为“自主”的功能的能力感到好奇。假设我们有两个 Java 程序正在运行。并且一个程序确定另一个程序正在占用内存,因此会终止该程序和/或为 JVM 分配更多内存。

我知道在 Java 中你可以看到可用内存是多少(参见 How to do I check CPU and Memory Usage in Java?),但如果我们想深入挖掘呢?

谢谢。

【问题讨论】:

  • 如果您仍然对可以在 Java 中实现的“自主”功能感兴趣(不仅仅是@Sam 建议的命令行级别),也许我的回答可能会有所帮助。

标签: java memory process jvm


【解决方案1】:

1.为 JVM 增加内存

您可以使用以下代码在 Java 中指定初始和最大堆大小..

java -Xms64m -Xmx256m ...

在这

-Xms<size> specifies the initial Java heap size
-Xmx<size> the maximum Java heap size.

2。检查您的程序轻松使用了多少内存

当您在计算机中安装 jdk 时,会提供一个非常方便的工具,它会显示所有正在运行的 Java 程序在您的计算机中占用的内存、堆空间。

Java 视觉虚拟机

http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/

你可以在你安装的 jdk 的 bin 文件夹中找到它。

以前的 stackoverflow 帖子也应该有所帮助 Monitoring own memory usage by Java application

【讨论】:

    【解决方案2】:

    您问:-是否有可能增加 JVM 的可用内存和/或杀死其他 Java 程序?

    1. 是的,有可能您可以增加jvm 的堆大小,例如:

            java -Xmx512M ClassName //512M = memory you want to increase
      
    2. 杀死一个进程,例如:taskkill /F /IM &lt;processname&gt;.exe

    注意
    ->但这不是一个好主意,因为堆可能是固定大小的,或者可能会根据垃圾收集器的策略进行扩展。
    -> 打开您的命令提示符输入taskkill/? 以了解详细信息。

    3 .您可以查看jvm当前保留的总内存、可用内存和最大内存 以这种方式。

              int  MegaBytes = 1024*1024 ;
    
              long  freeMemory = Runtime.getRuntime().freeMemory() / MegaBytes;
              long  totalMemory = Runtime.getRuntime().totalMemory() / MegaBytes;
              long  maxMemory = Runtime.getRuntime().maxMemory() / MegaBytes;
    
              System.out.println("Memory used by JVM: " + (maxMemory - freeMemory));
              System.out.println("freeMemory in JVM: " + freeMemory);
              System.out.println("totalMemory in JVM : " + totalMemory);
              System.out.println("maxMemory in JVM: " + maxMemory);
    

    更多信息please check here。

    【讨论】:

    • 确实,增加保留的最小 RAM 通常更有意义
    • 我认为OP希望在JVM运行时增加内存。
    • @sam 嘿,每次运行它都会返回相同的值,JVM 使用的内存:JVM 中的 1656 freeMemory:JVM 中的 118 totalMemory:JVM 中的 119 maxMemory:1774
    【解决方案3】:

    关于您问题的“自主”部分,确实可以在 Java 中进行进程管理,尽管有限:

    • 假设所有要管理的进程总是 从您的 Java 应用程序中使用 ProcessBuilder.start(),您可以使用destroy() 要杀死的进程上的方法。请参阅this answer 了解更多信息。

    • 检测进程何时有太多 内存 意味着能够 收集有关该过程的信息。麻烦的是信息 只能由操作系统访问。不可避免地,你会有 使用某种命令或第三方工具来获取它。为了 更多信息,请查看this other answer。

    • 虽然相关性模糊,但关闭 钩子 允许您做一些 应用程序关闭时自动执行重要的杂务。为了 例如,保存/关闭任何打开的文档/文件。你可以 在related answer 阅读更多内容。

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      您可以尝试在尝试运行程序时添加 -XmsMBm。 例如 java -Xms64m 类名

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-30
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多