我有一个在Linux下运行的Java应用程序的问题。
当我使用默认的最大堆大小(64 MB)启动应用程序时,我看到使用tops应用程序为应用程序分配了240 MB的虚拟内存。这就给计算机上的其他一些软件带来了一些问题,这些软件的资源相对有限。
保留的虚拟内存无论如何都不会被使用,据我所知,因为一旦达到堆限制,就会抛出OutOfMemoryError错误。我在windows下运行相同的应用程序,我看到虚拟内存大小和堆大小是相似的。
是否有任何方式,我可以配置在Linux下的Java进程使用的虚拟内存?
编辑1:问题不在于堆。问题是,如果我设置一个128 MB的堆,Linux仍然分配210 MB的虚拟内存,这是不需要的,永远。**
编辑2:使用ulimit -v允许限制虚拟内存的数量。如果大小集低于204 MB,那么即使应用程序不需要204 MB,只需要64 MB,它也不会运行。所以我想了解为什么Java需要这么多虚拟内存。这种情况可以改变吗?
编辑3:系统中还运行着其他几个嵌入式应用程序。系统确实有一个虚拟内存限制(来自评论,重要细节)。
Sun的java 1.4有以下参数来控制内存大小:
-Xmsn
Specify the initial size, in bytes, of the memory allocation pool.
This value must be a multiple of 1024
greater than 1MB. Append the letter k
or K to indicate kilobytes, or m or M
to indicate megabytes. The default
value is 2MB. Examples:
-Xms6291456
-Xms6144k
-Xms6m
-Xmxn
Specify the maximum size, in bytes, of the memory allocation pool.
This value must a multiple of 1024
greater than 2MB. Append the letter k
or K to indicate kilobytes, or m or M
to indicate megabytes. The default
value is 64MB. Examples:
-Xmx83886080
-Xmx81920k
-Xmx80m
http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html
Java 5和6有更多的功能。参见http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp
使用-XX:MaxHeapFreeRatio变量是在资源有限的情况下减少系统堆的一种方法。这通常设置为70,是GC收缩堆之前的最大空闲百分比。将它设置为一个较低的值,您将在eg jvisualvm分析器中看到您的程序通常使用较小的堆块。
编辑:要为-XX:MaxHeapFreeRatio设置小值,必须同时设置-XX:MinHeapFreeRatio
如
java -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=25 HelloWorld
EDIT2:添加了一个实际应用程序的示例,该应用程序启动并执行相同的任务,一个使用默认参数,另一个使用10和25作为参数。我没有注意到任何实际的速度差异,尽管在后面的例子中,java理论上应该使用更多的时间来增加堆。
最后,最大堆是905,使用堆是378
最后,最大堆是722,使用堆是378
这实际上有一些影响,因为我们的应用程序运行在远程桌面服务器上,许多用户可能同时运行它。
Sun的java 1.4有以下参数来控制内存大小:
-Xmsn
Specify the initial size, in bytes, of the memory allocation pool.
This value must be a multiple of 1024
greater than 1MB. Append the letter k
or K to indicate kilobytes, or m or M
to indicate megabytes. The default
value is 2MB. Examples:
-Xms6291456
-Xms6144k
-Xms6m
-Xmxn
Specify the maximum size, in bytes, of the memory allocation pool.
This value must a multiple of 1024
greater than 2MB. Append the letter k
or K to indicate kilobytes, or m or M
to indicate megabytes. The default
value is 64MB. Examples:
-Xmx83886080
-Xmx81920k
-Xmx80m
http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html
Java 5和6有更多的功能。参见http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp