2

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

java -jar -Xmx512m MyApp.jar

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

谢谢

4

4 回答 4

1

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

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

有时这不是预期的行为,可以使用 -Xms 设置堆大小的下限。然后 JVM 将始终保留 Xms 和 Xmx 之间大小的堆。

于 2012-12-20T07:35:37.233 回答
0
-Xmx2048m -XX:-UseGCOverheadLimit

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

于 2012-12-20T07:33:22.043 回答
0

这会将您的最大 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)
于 2012-12-20T07:35:52.547 回答
0

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

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

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

java -ms256m -mx30g -jar MyApp.jar

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

于 2012-12-20T09:09:17.940 回答