我有个问题在想。假设我向JVM传递了两个参数:在程序开始时分配了256MB的-Xms256mb -Xmx1024mb。接下来,创建一些对象,并且JVM进程尝试分配更多的内存。假设JVM需要分配800MB。Xmx属性允许这样做,但是系统(假设是Linux/Windows)上当前可用的内存是600MB。OutOfMemoryError会被抛出吗?或者也许掉期机制会发挥作用?
我的第二个问题与GC算法的质量有关。假设我有jdk1.5u7和jdk1.5u22。在后一种JVM虚拟机中,内存泄漏会消失并且不会发生OutOfMemoryError吗?最新版本的GC质量能更好吗?
发布于 2012-08-11 01:29:22
GC的质量(有buggy的GC除外)不会影响内存泄漏,因为内存泄漏是应用程序的产物-- GC不能收集不是实际垃圾的东西。
如果JVM需要更多内存,它将从系统中获取内存。如果系统可以交换,它将交换(就像任何其他进程一样)。如果系统不能交换,您的JVM将失败,并出现系统错误,而不是OOM异常,因为系统不能满足请求,这一点实际上是致命的。
通常,您永远不会希望活动的JVM部分地被换出。当系统在虚拟内存系统中循环页面时,GC事件将会使您崩溃。将一个空闲的后台JVM作为一个整体进行交换是一回事,但是如果你的机器是1G的RAM,而你的主进程需要1.5 to,那么你就有一个大问题了。
JVM就像有呼吸的空间。我见过JVM在没有足够内存的情况下陷入GC死亡螺旋,即使它们没有内存泄漏。他们只是没有足够的工作集。添加另一块堆将JVM从糟糕的GC图转变为令人愉快的锯齿GC图。
给JVM提供它所需要的内存,它会变得更快乐。
发布于 2012-08-11 01:29:48
“内存”和"RAM“不是一回事。内存包括虚拟内存(交换),因此在获得OutOfMemoryError之前,您可以分配总共空闲的RAM+空闲交换空间。
发布于 2012-08-11 01:27:18
分配取决于使用的操作系统。如果你分配了太多的内存,也许你最终会把部分内存加载到交换空间中,这是很慢的。如果你的程序运行得更慢,取决于虚拟机如何处理内存。
我不会指定一个不太大的堆,以确保它不会占用所有的内存,从而防止VM的速度变慢。
https://stackoverflow.com/questions/11906219
复制相似问题