我有一个 java 应用程序表单,我正在访问数据库中的记录,处理它并再次更新数据库。我通过将我的 java 应用程序转换为 JAR 并从命令提示符执行它来做到这一点。在测试期间,数据库中每个表只有 20 条记录。为此,我按如下方式执行 jar 以避免内存不足错误,
java -jar -Xmx512m MyApp.jar
如果数据库包含很多记录(50,000),如何在执行 jar 时增加堆大小或如何在执行 jar 时根据需要动态增加堆大小。
谢谢
最大堆大小是在运行程序之前使用您已经使用的 -Xmx 选项设置的。根据此信息,JVM 将根据需要使用尽可能多的堆大小,直至给定数量。因此,如果您的程序只需要 1 MB 的 RAM,JVM 将只使用该数量,如果它需要 1G 而您只给了它 512M,您将收到 OutOfMemoryError。
所以,基本上,如果你需要,你可以给你的程序更多的堆空间,JVM会根据它的需要动态调整使用的堆大小。
有时这不是预期的行为,可以使用 -Xms 设置堆大小的下限。然后 JVM 将始终保留 Xms 和 Xmx 之间大小的堆。
-Xmx2048m -XX:-UseGCOverheadLimit
在你的虚拟机参数中设置它。您可以设置较小的内存大小来代替 2048
这会将您的最大 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)
最大值是您需要的最大堆,而不是实际使用的堆。这是您宁愿应用程序崩溃也不愿继续运行的时候。JVM 将动态管理到目前为止使用的内存。
如何在执行 jar 时根据需要动态增加堆大小。
因此,如果您希望 JVM 使用 256 MB,但您希望它动态增长到 30 GB,您可以这样设置
java -ms256m -mx30g -jar MyApp.jar
即使是最低限度也不能保证使用。JVM 将尽最大努力将内存使用率保持在此级别。无论您将最小值设置为多少,Hello World 程序都不会使用 256 MB 的堆。