首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java堆/pool大小

Java堆/pool大小
EN

Stack Overflow用户
提问于 2012-07-26 19:54:04
回答 2查看 975关注 0票数 0

当我启动JVM时,它至少保留了{{xms}}内存,对吗?这意味着这个内存对于JVM进程是私有的(它是错误的),对吗?当JVM需要增加备用堆(mallocs)时,就需要更多的内存。但多少钱?我不相信它的储备完全没有它所需要的,可能有一定的步骤(池?)大小。

如何配置这个“步长”?

直到{{xmx}被到达,OOM被抛出,对吗?

JVM什么时候启动GC?不是在xmx,而是在保留堆大小(这个池的顶部)?

如果是这样的话,最好将xms设置在xmx附近,以防止许多无用的GC。我将拥有一个巨大的GC,而不是很多小GC,每个GC都会冻结我的JVM,所以最好有一个,对吧?

EN

回答 2

Stack Overflow用户

发布于 2012-07-26 20:05:08

当JVM需要增加备用堆(mallocs)时,就需要更多的内存。但多少钱?

你不应该真的在意。只是起作用了。许多建议使用相同的XmxXms,以便JVM在启动时分配所有内存。这是合理的,再读一遍。

如何配置这个“步长”?

它不能,它是完全实现,可能是操作系统依赖。

JVM什么时候启动GC?不是在xmx,而是在保留堆大小(这个池的顶部)?

GC比你想象的要复杂一些。当年轻一代被填满时,就会执行小GC。主要的GC被称为,在老一代没有更多的空间。

直到{{xmx}被到达,OOM被抛出,对吗?

不,当达到Xmx时,JVM就稳定了,没有任何错误发生。当JVM无法为新对象找到足够的空间(这是一个主要的简化)时,就会抛出OutOfMemoryError

如果是这样的话,最好将xms设置在xmx附近,以防止许多无用的GC。

再次,您必须学习GC是如何工作的。使用等同于XmxXms是一个很好的选择,因为它避免了应用程序运行时不必要的分配(所有事情在启动时都会发生,没有进一步的开销)。与此无关。

与许多小错误不同,每个GC都会冻结我的JVM,所以最好有一个,对吧?

不是的。小GC通常需要几十毫秒,而且几乎是不可见的,除非您正在处理实时系统。主要(停止-世界) GC可能需要几秒钟,当然是明显的最终用户。在正确调优的JVM中,主GC应该很少出现。

票数 5
EN

Stack Overflow用户

发布于 2012-07-26 20:03:57

你对开关的意义是正确的。

我记得开关的方式是

xm*s* =以"s“结尾,例如"*s*tarting memory”。

xm*x* =以"x“结尾,如"ma*x*imum内存”

由给定的JVM来决定如何从启动内存移动到最大内存。假设这两者不是非常接近,那么在我所知道的所有JVM上都会分步骤进行分配。

我不知道有任何选项可以控制JVM中步骤的大小。当然没有标准的选择。

不同的JVM有不同的GC策略。有些JVM允许您使用由命令行开关控制的多个GC策略之一。

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

https://stackoverflow.com/questions/11677028

复制
相关文章

相似问题

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