2012-12-20 146 views
2

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

java -jar -Xmx512m MyApp.jar 

如果数据库包含很多记录(50,000),如何在执行罐子或如何动态增加基于需求的同时,执行罐子堆的大小增加堆大小。

感谢

+0

可能的重复[如何以编程方式增加java堆大小](http://stackoverflow.com/questions/2073869/how-to-increase-java-heap-size-programmatically) –

+0

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

回答

0

最大的是你需要永远多少会实际使用的最大堆。这是您宁可应用程序崩溃而不是继续运行的一点。 JVM将动态管理到目前为止使用的内存。

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

所以,如果你想JVM使用256 MB,但是你想让它动态增长高达30 GB,你会设置这样的

java -ms256m -mx30g -jar MyApp.jar 

即使是最小的,但不保证使用。 JVM将尽最大努力将内存使用量保持在这个水平。无论您设置的最小值为多少,Hello World程序都不会使用256 MB的堆。

0
-Xmx2048m -XX:-UseGCOverheadLimit 

设置这在你的虚拟机Arguement。 您可以设置更少的内存大小来代替2048

+0

看到这个链接http://stackoverflow.com/questions/2073869/how-to-increase-java-heap-size-programmatically –

1

在使用您已使用的-Xmx选项运行程序之前设置最大堆大小。根据这些信息,JVM将根据需要使用尽可能多的堆大小,达到给定的数量。所以如果你的程序只需要1MB的内存,那么JVM将只使用这个数量,如果它需要1G而你只给它512M,你会得到一个OutOfMemoryError。

因此,基本上,如果需要,您可以为程序提供更多堆空间,并且JVM将根据其需要动态调整已用堆大小。

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

0

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

java -Xms256m -Xmx1024m -jar MyApp.jar 

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

JVM的参数必须在-jar部分之前传递。其原因可当我们执行“Java的版本”中可以看出:

用法:

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