Java 从JVM内部修改JVM参数

Java 从JVM内部修改JVM参数,java,jvm,vmargs,Java,Jvm,Vmargs,有没有办法从jvm内部修改jvm参数?具体来说,我希望能够从jvm内部更改jvm的最大堆大小。这可能吗 编辑:我想我应该添加我想这样做的原因。我有一些运行在不同机器/平台上的Java程序。这些程序的配置源于运行时,并且根据程序运行的机器/环境的不同而有所不同。其中一些配置可以在运行时更改,并且随着配置的更改,各种程序会自动更新自身 我希望heap size是这些配置参数中的一个,与配置的其余部分一样,在运行时获取这些参数。如果是这样,那么程序可以启动(使用一些默认的jvm参数),然后根据检索到的

有没有办法从jvm内部修改jvm参数?具体来说,我希望能够从jvm内部更改jvm的最大堆大小。这可能吗

编辑:我想我应该添加我想这样做的原因。我有一些运行在不同机器/平台上的Java程序。这些程序的配置源于运行时,并且根据程序运行的机器/环境的不同而有所不同。其中一些配置可以在运行时更改,并且随着配置的更改,各种程序会自动更新自身

我希望heap size是这些配置参数中的一个,与配置的其余部分一样,在运行时获取这些参数。如果是这样,那么程序可以启动(使用一些默认的jvm参数),然后根据检索到的配置进行自我调整

具体来说,我希望能够 更改文件的最大堆大小 jvm的内部。这是吗 可能吗


不。

这是一个半严肃的、完全脱离墙壁的黑客思想:


…如果您从当前jvm生成了一个新的java实例(具有新设置),然后从新jvm杀死了旧进程,会怎么样?我不知道这是否会有帮助(甚至不起作用).

您不能仅仅因为这会损害系统的安全性而更改这些选项

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

无论如何,一个程序不应该在运行时改变内存需求之类的东西——管理员应该知道并设置这些内容。您的程序没有理由需要在运行时执行此操作。如果它真的需要改变这一点,那么问题的原因可能是为什么管理员类型的dude不这样做?

您至少可以建议堆大小

JVMFactory.getJVM().getMemorySystem().suggestHeapSize(100*1000*1000);

有关更多信息,请参见

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

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


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

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

我知道有几台大型服务器运行几十台1G+堆JVM。如果这些运行时可以在低使用时间内缩小其高水位线,那么您就可以更好地硬管理您的系统资源。

(几年后),我发现一个库可以实现我发布时所需的功能。是用于监视Java进程的库。它允许使用新参数重新启动JVM


使用此方法与使用引导启动新进程的区别在于,stdin/stdout和其他文件描述符会自动共享。

您不需要从子进程中删除父进程,父进程可以在子进程运行后自行删除。根据要求,这不是一个不合理的解决方案。基本上,编写一个引导应用程序来读取配置并启动“真正的”应用程序。你甚至可以使用Terracotta来实现这一点。生成新VM-使用Terracotta复制字段,然后杀死父级。根据我对Javadoc的阅读,这不允许您使堆大小大于最大堆大小(-mx)。此外,它对Sun JVM不起作用。