Lim*_*awk 24 tomcat memory-management java-8
因此,在提出这个问题之后,很快就发现重要的问题不是"我怎么能",而是"我应该"吗?
我们的客户正在从Java7迁移到Java8(使用Tomcat7).Java7需要设置-XX:MaxPermSize
,并且由于个人需求和使用,一些客户已将其最大值增加到安装程序设置的默认值以上.
我应该设置-XX:MaxMetaspaceSize
(以前的-XX:MaxPermSize
设置)谁定义了一个自定义的最大客户?新安装怎么样?我们应该设置-XX:MaxMetaspaceSize
吗?
这样的决定有哪些利弊?
the*_*472 23
正如我在上一个回答中评论的那样,对这些内存池设置限制的原因是不同的.
如果您的用户之前将MaxPermSize 增加到高于默认值,可能是为了避免使用CMS的Full GCs /并发模式故障,或者因为他们的应用程序真正需要大量的perm gen空间.
从有效的无限默认值中减少元空间限制将产生完全不同的目的:避免无限制的元空间增长.
事情是,这只是一个上限.实际提交的,即当前的元空间大小将更小.实际上,有一个名为MaxMetaspaceFreeRatio
(默认为70%)的设置,这意味着实际的元空间大小永远不会超过其占用率的230%.
并且为了它的增长它首先必须填满,迫使垃圾收集(元空间已满)试图释放对象,并且只有当它不能满足其MinMetaspaceFreeRatio
(默认的40%)目标时才会将当前的元空间扩展到不超过GC循环后占用率的230%.
因此在实践中,除非应用程序不断泄漏类加载器/类或生成大量动态代码,否则实际元空间大小应稳定在相对于其实际需要的带内.
TL; DR:可能有理由限制元空间大小,但它们可能与设置perm gen大小的原始原因不同.因此需要重新评估.
只是为了表达相反的意见,这种情况可以始终设置 MaxMetaspaceSize。将世界上的整个应用程序集分成 10 个(二进制 - 考虑一下)组,可以讨论原因。但请记住,设置限制仅控制该空间的垃圾收集 (GC) 何时发生。
组 01:具有所有非动态类的应用程序
该组将您置于上面提到的稳定带中。在这种情况下,要设置的大小相当容易确定(就像 MaxPermSize 一样)并且不会有太多(如果有)GC。
第 10 组:具有动态类的应用程序
鉴于功能强大的第三方库的激增,该组中几乎每个应用程序都不是吗?通常,您并不关心库是否是 Scala/Groovy/等,它只是完全按照您的要求执行操作,因此可以使用它。用一堆死(动态)类填充元空间有什么价值?当 GC 来时,它会很昂贵。我宁愿限制大小,使 GC 更频繁(但每个 GC 的暂停时间更少),并且更轻松地在同一硬件上运行多个应用程序,而不必担心它们的各个元空间会相互碰撞。
归档时间: |
|
查看次数: |
40430 次 |
最近记录: |