【问题标题】:Java Increase Heap sizeJava 增加堆大小
【发布时间】:2012-12-07 16:22:32
【问题描述】:

我有一个 java 应用程序表单,我正在访问数据库中的记录、处理它并再次更新数据库。 我通过将我的 java 应用程序转换为 JAR 并从命令提示符执行它来做到这一点。在测试期间只有 20 条记录 数据库中的每个表。为此,我按如下方式执行 jar 以避免内存不足错误,

java -jar -Xmx512m MyApp.jar

如果数据库包含很多记录(50,000),如何在执行jar时增加堆大小或如何在执行jar时根据需要动态增加堆大小。

谢谢

【问题讨论】:

  • 除了设置最小/最大堆大小(在分析应用程序之后)之外,您还应该查看垃圾收集策略,通常使用更好的 gc 策略可以用更少的内存获得更多价值。可用选项取决于您使用的 Java 版本。 Jconsole 是你的朋友。

标签: java database


【解决方案1】:

在运行程序之前使用您已经使用的 -Xmx 选项设置最大堆大小。根据此信息,JVM 将根据需要使用尽可能多的堆大小,直至给定数量。因此,如果您的程序只需要 1 MB 的 RAM,JVM 将只使用该数量,如果它需要 1G 而您只给了它 512M,您将收到 OutOfMemoryError。

所以,基本上,如果你需要,你可以给你的程序更多的堆空间,JVM会根据它的需要动态调整使用的堆大小。

有时这不是预期的行为,可以使用 -Xms 设置堆大小的下限。那么JVM会一直保留Xms和Xmx之间大小的堆。

【讨论】:

    【解决方案2】:

    最大值是您永远需要的最大堆,而不是实际使用的堆。这是您宁愿应用程序崩溃也不愿继续运行的时候。 JVM 将动态管理到此为止已使用的内存。

    如何在执行 jar 时根据需要动态增加堆大小。

    因此,如果您希望 JVM 使用 256 MB,但又希望它动态增长到 30 GB,您可以这样设置

    java -ms256m -mx30g -jar MyApp.jar
    

    即使是最小值也不能保证使用。 JVM 将尽最大努力将内存使用率保持在此级别。无论您将最小值设置为多少,Hello World 程序都不会使用 256 MB 的堆。

    【讨论】:

      【解决方案3】:
      -Xmx2048m -XX:-UseGCOverheadLimit
      

      在你的虚拟机参数中设置它。 您可以设置较小的内存大小来代替2048

      【讨论】:

      【解决方案4】:

      这会将您的最大 heapSize 增加到 1Gb。

      java -Xms256m -Xmx1024m -jar MyApp.jar
      

      其中 -Xms 指定初始 Java 堆大小,-Xmx 指定最大 Java 堆大小。

      JVM 的参数必须在 -jar 部分之前传递。当我们执行“java -version”时可以看出原因:

      用法:

      java [-options] class [args...]
                 (to execute a class)
         or  java [-options] -jar jarfile [args...]
                 (to execute a jar file)
      

      【讨论】:

        猜你喜欢
        • 2013-01-26
        • 2012-07-14
        • 2012-09-20
        • 2010-12-06
        • 2010-10-27
        • 2022-11-21
        • 2012-09-26
        • 2013-12-24
        相关资源
        最近更新 更多