首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-Xmx属性和可用系统内存关联

问-Xmx属性和可用系统内存关联
EN

Stack Overflow用户
提问于 2012-08-11 01:04:34
回答 4查看 1.2K关注 0票数 2

我有个问题在想。假设我向JVM传递了两个参数:在程序开始时分配了256MB的-Xms256mb -Xmx1024mb。接下来,创建一些对象,并且JVM进程尝试分配更多的内存。假设JVM需要分配800MB。Xmx属性允许这样做,但是系统(假设是Linux/Windows)上当前可用的内存是600MB。OutOfMemoryError会被抛出吗?或者也许掉期机制会发挥作用?

我的第二个问题与GC算法的质量有关。假设我有jdk1.5u7和jdk1.5u22。在后一种JVM虚拟机中,内存泄漏会消失并且不会发生OutOfMemoryError吗?最新版本的GC质量能更好吗?

EN

回答 4

Stack Overflow用户

发布于 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提供它所需要的内存,它会变得更快乐。

票数 2
EN

Stack Overflow用户

发布于 2012-08-11 01:29:48

“内存”和"RAM“不是一回事。内存包括虚拟内存(交换),因此在获得OutOfMemoryError之前,您可以分配总共空闲的RAM+空闲交换空间。

票数 2
EN

Stack Overflow用户

发布于 2012-08-11 01:27:18

分配取决于使用的操作系统。如果你分配了太多的内存,也许你最终会把部分内存加载到交换空间中,这是很慢的。如果你的程序运行得更慢,取决于虚拟机如何处理内存。

我不会指定一个不太大的堆,以确保它不会占用所有的内存,从而防止VM的速度变慢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11906219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档