Java 在运行时设置JVM堆大小

Java 在运行时设置JVM堆大小,java,jvm,runtime,heap,Java,Jvm,Runtime,Heap,有没有办法从运行的Java程序设置堆大小 根据,您不能在运行时执行此操作,但可以生成另一个具有不同堆大小的进程。您可以在启动应用程序时调整这些设置,但一旦JVM启动并运行,这些值就无法更改。大概是这样的: java-Xms32m-Xmx512m FooBar 将最小堆大小设置为32MB,最大堆大小设置为512MB。一旦设置好,您就不能在运行的程序中更改它们。否 对于具有非常可变堆要求的应用程序,您可以使用-Xmx将最大堆大小设置得非常高,然后调整-XX:MaxHeapFreeRatio和-XX:

有没有办法从运行的Java程序设置堆大小

根据,您不能在运行时执行此操作,但可以生成另一个具有不同堆大小的进程。

您可以在启动应用程序时调整这些设置,但一旦JVM启动并运行,这些值就无法更改。大概是这样的:

java-Xms32m-Xmx512m FooBar

将最小堆大小设置为32MB,最大堆大小设置为512MB。一旦设置好,您就不能在运行的程序中更改它们。

对于具有非常可变堆要求的应用程序,您可以使用
-Xmx
将最大堆大小设置得非常高,然后调整
-XX:MaxHeapFreeRatio
-XX:MinHeapFreeRatio
,这样当堆收缩时,应用程序就不会占用大量内存(它使用默认设置)


但请注意,当应用程序实际使用的内存变化强烈且迅速时,这可能会导致性能问题——在这种情况下,最好让它保留所有内存,而不是将其返回操作系统,只在一秒钟后再次使用。您可能还想摆弄一下,以确保GC不会留下太多无人认领的对象,当堆有很大的增长空间时,它往往会这样做,这将无法实现希望堆大小调整到应用程序需要的目标。

如果我正确理解您的问题,您正在尝试在运行时更改堆大小。我看不出有任何理由可以这样做。使用
-Xmx
JVM选项设置启动时的堆大小。我还建议您仅在绝对需要时设置
-Xms
选项。此选项设置为JVM分配的头内存的初始量


您应该知道应用程序在内存方面的行为。明智地设置
-Xmx
的值。如果你的应用程序是某种服务器应用程序,你可以设置一个更高的值,否则会影响你的选择,因为其他可能的应用程序运行在客户端机器上,当然还有可用的内存。

人们的共识可能确实是这是不可能的,但我们应该看看JVM源代码,看看它是如何进行人体工程学控制的。如果有一个JVMTI代理能够在线/在运行时调整heap/perm/tenured/new/&c大小,那就太好了


这会怎么样?它将允许代理根据性能或占用目标推断大小调整,这在将JVM移入云中时非常重要。

我问自己同样的问题。与上面的答案不同,我可以对我的应用程序增加最大堆JVM大小做些什么。若应用程序是集群模式下的web服务器,那个么我可以启动一个具有更改的最小/最大堆大小的新实例,然后关闭初始实例。在GlassFish中,这应该特别简单,因为您将管理实例与nodeAgent(应用服务器集群实例)JVM分离


由于许多JVM应用程序都是web应用程序,我认为值得在本博客中保留。

您可以在启动时使用-mx选项(也称为-Xmx),这是您应该需要的最大大小,因为您不需要将其设置为超过您需要的最大大小


但是,解决方法是让main()检查最大大小,如果最大大小不符合要求,则重新启动java。i、 e.启动另一个java程序并死亡。

明智地设置值。。。是的,这是个好建议。但是考虑一下这个案例——你正在观察如何使应用程序接近堆最大值,而你却无能为力。是的,代码有漏洞。。。但首先,我们需要在白天保持活动状态,然后我们将解决问题注意,这可能是一个小程序或其他类型的应用程序,您不控制VM启动设置。这些情况下,这将是很好的。我认为,主要的问题是,如果您能够改变这一点,您可能会遇到与安全相关的内存问题。作为参考,这里是热点的RFE:bugs.sun.com/bugdatabase/view_bug.do?bug_id=4408373这看起来像是一个JVM功能请求,而不是一个答案。也被称为背部巨大的疼痛。如果你正在使用大量内存,你最不想做的就是释放所有内存,然后在另一个进程中重新加载。当然,您不能让旧进程保持足够长的开放时间来传输数据,因为您仅仅为了传输而占用了两个进程更多的内存。最好希望你这次猜对了,或者你可以重新做一遍。这假设你事先知道你需要多少内存。这对于网络服务器/其他流媒体来说是很好的,但是如果你在分析数据(比如建立索引/寻找趋势),你需要提前知道你的数据将是什么,这是很好的limiting@Basic你不需要知道你需要多少内存。-Xmx是JVM可以拥有的最大值,即程序应该因OutOfMemoryError而崩溃,而不是使用更多内存。此最大值通常基于您拥有的内存量,默认值为主内存的1/4。JVM不会为“hello world”使用大量内存无论您将最大值设置为什么,都要执行程序。假设您有一个进程,并提前为其提供50 gig内存,在运行过程中,请注意大量GC正在进行,可能56 GiB会更好,并且您无法在不进行大量重新计算的情况下轻松重新启动程序…@kap因此最好将最大值设置为您希望程序失败,而不是继续运行。-XX:maxheapfreeration此项的默认值为70。空闲比率是堆上未分配的空间量与总堆大小之比。如果可用空间的百分比超过默认值70%,jvm将重新减小堆的大小,以允许操作系统使用内存,