【问题标题】:how to increase the java heap size permanently如何永久增加java堆大小
【发布时间】:2019-02-10 12:23:00
【问题描述】:

我正在尝试增加生产服务器中的 java 堆内存。这是我正在尝试的两种方式。

方式 1

I have tried the following answer from this link. 我已经通过以下命令设置了java内存。

export _JAVA_OPTIONS="-Xmx10g"
java -XshowSettings:vm 

这样,java 堆大小不会永久增加。

方式 2

I have tried this answer. 我已尝试通过以下命令增加 java 堆大小。

java -XX:+PrintFlagsFinal -Xms5240m -Xmx10240m -Xss512k -XX:PermSize=64m -XX:MaxPermSize=128m  -version | grep -iE 'HeapSize|PermSize|ThreadStackSize

这样,java堆大小不会永久增加。

结论

通过上述方式,我无法成功永久更改 Java 堆大小。那么如何永久更改 Java 堆大小呢?请给我一个方法。提前致谢。

更新:

在这里,我想用“永久”一词来表示以下含义。

含义:如果我运行以下命令,那么我希望每次打开 shell 时都看到相同的堆大小。

java -XX:+PrintFlagsFinal -version | grep -iE'HeapSize|PermSize|ThreadStackSize'   

【问题讨论】:

标签: java jsp tomcat redhat heap-memory


【解决方案1】:

经过 4 小时的长时间查询,我找到了以下解决方案。要修改系统范围的配置文件,请转到 /etc/profile 。或者,您可以运行以下命令。

 1. vi /etc/profile
 2. export  _JAVA_OPTIONS="-Xms5000m -Xmx12000m"

要检查 java 堆内存大小,请运行以下命令:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

此命令在我的电脑中输出以下内容。

Picked up _JAVA_OPTIONS: -Xms5000m -Xmx12000m
     intx CompilerThreadStackSize                   = 0                                   {pd product}
    uintx ErgoHeapSizeLimit                         = 0                                   {product}
    uintx HeapSizePerGCThread                       = 87241520                            {product}
    uintx InitialHeapSize                          := 5242880000                          {product}
    uintx LargePageHeapSizeThreshold                = 134217728                           {product}
    uintx MaxHeapSize                              := 12582912000                         {product}
     intx ThreadStackSize                           = 1024                                {pd product}
     intx VMThreadStackSize                         = 1024                                {pd product}
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

您会发现以下教程非常有用。

https://www.mkyong.com/java/find-out-your-java-heap-memory-size/

【讨论】:

  • 强烈反对。虽然在技术上是正确的,但您不想在您的系统上执行此操作:请参阅我的替代答案。
【解决方案2】:

只需在需要的 java 可运行实例中调整内存参数。每个 Java 实例都有自己的 jvm 空间。

【讨论】:

    【解决方案3】:

    当您用“tomcat”标记问题时,我不同意您发布的答案。或者至少具有该答案的适用性:当tomcat启动时,您想要设置某些选项。当您配置 任何 java 进程,该进程开始具有这些选项时,您正在为灾难做好准备:

    当您关闭 tomcat 时,它会启动一个非常短暂的 Java 进程,该进程连接到正在运行的服务器,发出关闭信号,然后终止。对于此操作,您不需要任何特定的内存,相反,如果您想关闭 tomcat 时没有 5G 的可用内存 (-Xms5000m),这可能会失败。

    如果您启动 jconsole 以检查 tomcat JMX bean,以查看发生了什么,您将再次需要 5G。对于任何其他将在您的计算机上运行并且您甚至不知道的小型 java 工具。 (当您使设置真正全局化时:任何用户启动的任何进程可能会施加这些巨大的资源需求。

    现在,该怎么做?

    对于tomcat,在Linux环境中(你标记“redhat”),在tomcat的bin/setenv.sh中创建一个文件并设置变量CATALINA_OPTS,例如

    CATALINA_OPTS="$CATALINA_OPTS -Xms5000m -Xmx5000m"
    

    如果 Tomcat 作为守护进程运行,最好在其他地方进行此设置。

    为了完整起见,即使您没有标记 Windows:对于 Windows,请在 bin/setenv.bat 中执行等效操作。这些文件不是 tomcat 发行版的一部分,例如它们不会在更新时被覆盖。但如果他们在那里,他们将被考虑在内。对于 Windows 服务,使用服务配置进行适当的设置

    另一个建议:对于生产服务器,您希望将-Xms 设置为与-Xmx 相同的值。原因:如果在启动时最大内存不可用,您希望立即计算出来,而不是在周日凌晨 3 点,当 JVM 决定它想要拥有更大的内存块时。

    【讨论】:

    • 在bin/setenv.sh中设置好参数后,可以通过./startup.sh启动tomcat服务器吗?或者我必须通过 ./catalina.sh 启动 tomcat 服务器?
    • 是的,当然。 startup.sh 最后调用catalina.shcatalina.sh 嵌入setenv.sh(如果存在)。所以./startup.sh./catalina.sh run 都可以工作。
    • 在稳定(生产)环境中将 -Xms 和 -Xmx 设置为相同值的第二个正当理由是效率/性能;如果您最终要扩展到 -Xmx,您最好立即获取该内存,而不是在需要时动态获取它。
    【解决方案4】:

    在 Rhel7 或 CentOS7 上,你应该更改 /usr/lib/systemd/system/tomcat.service:

    Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
    

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 2012-07-19
      • 2012-09-26
      • 2013-12-24
      • 2012-12-07
      • 2013-01-26
      • 2012-07-14
      • 2014-02-02
      相关资源
      最近更新 更多