在JVM内部修改JVM参数

3
有没有一种方法可以在JVM内部修改jvm args?具体来说,我想能够从内部更改jvm的最大堆大小。这可能吗?
编辑:我想我应该添加我想要做这件事的原因。我有几个Java程序在不同的机器/平台上运行。这些程序具有在运行时获取的配置,并且根据程序运行的机器/环境而异。其中一些配置可以在运行时更改,各种程序会随着配置更改而自动更新。
我希望堆大小成为这些配置参数之一,像其余配置一样在运行时获取。如果可以的话,那么程序可以启动(使用一些默认的jvm args),然后根据检索到的配置进行调整。
7个回答

6

这是一个半认真、完全离谱的黑客思路:

……如果你从当前的JVM中生成一个新的Java实例(使用新的设置),然后从新实例中杀死旧进程,会发生什么呢?我不知道这是否有帮助(或者是否能够正常工作)……


1
你不需要从子进程中杀死父进程,一旦子进程运行,父进程可以自行退出。 - paxdiablo
鉴于要求,这不是一个不合理的解决方案。基本上编写一个引导程序应用程序,读取配置并启动“真正”的应用程序。 - Michael Rutherfurd
你甚至可以使用Terracotta来做这个。生成新的虚拟机 - 使用Terracotta复制字段,然后杀死父进程。 - Fortyrunner

3

由于这会危及系统的安全性,您无法更改这些选项。

如果管理员希望通过设置安全管理器仅允许某个程序具有特定的功能,那么如果您可以关闭该功能,这将是一个严重的问题。

无论如何,一个程序不应该在运行时更改诸如内存需求之类的东西 - 这些应该由管理员知道并设置。您的程序没有理由需要在运行时执行此操作。如果确实需要更改此内容,也许问题的关键是为什么管理员不能自己完成?


2

具体来说,我希望能够在JVM内部更改最大堆大小。这种操作是否可行?

不行。


2
使用JRockit,你至少可以建议一个堆大小。
JVMFactory.getJVM().getMemorySystem().suggestHeapSize(100*1000*1000);

请查看JMAPI以获取更多信息。

根据我对Javadoc的阅读,这并不允许您将堆大小设置为大于最大堆大小(-mx)。此外,它不适用于Sun JVM。 - Stephen C

1
多年后,我发现了一个可以实现我当时所需的功能的库。Akuma是一个用于守护Java进程的库。它允许使用新参数重新启动JVM。
与使用引导程序启动新进程不同的是,stdin/stdout和其他文件描述符会自动共享。

0

动态设置 -Xmx 实例对于控制长时间运行的运行时预期系统资源(主要是占用内存)非常有帮助。当然,其中一个影响就是更大/更长的 GC 开销。

我知道有几台大型服务器机器正在运行数十个 1G+ 堆 JVM。如果这些运行时在低使用率时可以将其高峰值缩小,那么您可以更好地硬件管理系统资源。


0

正如其他人所指出的那样,通常只有通过具有引导程序(Java或其他语言)来调用主JVM并使用正确参数才能实现。

话虽如此,您确定这是必要的吗?您提到了“最大堆大小”。如果您指的是-Xmx参数:这只是VM可能永远不会超过的限制。这并不意味着VM将真正使用那么多,如果可以的话,它会使用更少。

因此,您始终可以将-Xmx设置为系统可以处理的最大值,并让JVM决定它实际需要多少。您为什么认为需要动态设置它?


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