在Java中,是否可以增加JVM可用内存和/或终止其他Java程序?

15

我对高级Java并不熟悉,请耐心等待。

我很好奇Java是否有实现所谓“自动化”功能的能力。假设我们有两个正在运行的Java程序。如果一个程序确定另一个程序正在占用内存,那么它会终止该程序和/或为JVM分配更多内存。

我知道在Java中可以查看可用内存(参见如何在Java中检查CPU和内存使用情况?),但如果我们想深入了解呢?

谢谢。


如果你仍然对Java中可以实现的“自治”特性感兴趣(不仅仅是像@Sam建议的在命令行级别上),也许我的回答会有所帮助。 - HQCasanova
4个回答

11

你的问题是:是否有可能增加JVM的可用内存或终止其他Java程序?

  1. 是的,你可以增加JVM的堆大小,比如:

          java -Xmx512M ClassName //512M = memory you want to increase
    
  2. 杀死进程的方法:taskkill /F /IM <processname>.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);

了解更多信息,请查看此处


实际上,增加保留的最小RAM通常更有趣。 - jwenting
3
我认为原帖作者想在 Java 虚拟机运行时增加内存。 - Raedwald
@sam 嘿,每次我运行它时都返回相同的值, JVM使用的内存:1656 JVM中的freeMemory:118 JVM中的totalMemory:119 JVM中的maxMemory:1774 - Nickromancer

9

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 Visual VM

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

您可以在已安装的JDK bin文件夹中找到该工具。

此外,以下stackoverflow帖子也应该对您有所帮助 Monitoring own memory usage by Java application


4
关于您问题中的“自主”部分,从Java内部进行进程管理是可以实现的,但功能有限:
- 假设所有要管理的进程都是使用ProcessBuilder.start()在您的Java应用程序内启动的,您可以使用destroy()方法来终止您想要杀死的进程。有关更多信息,请参见此答案
- 检测进程是否占用过多内存意味着能够收集有关该进程的信息。问题在于,只有操作系统才能访问这些信息。不可避免地,您将不得不使用某种命令或第三方工具来获取它。有关更多信息,请查看此其他答案
- 虽然与之有些相关,但关闭挂钩允许您在应用程序关闭时自动执行某些关键任务。例如,保存/关闭任何打开的文档/文件。您可以在此相关答案中了解更多信息。
希望这能有所帮助。

1

当您尝试运行程序时,可以尝试添加-XmsMBm参数。例如:java -Xms64m ClassName。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接