jvm 堆大小,蚂蚁面试

2022-09-16 21:16:02 +08:00
 badboy17

面试被问到我们的机器内存多大,我们的 jvm 参数怎么设置的,如果是 32g 的内存机器,堆应该设置多大比较合适,怎么考量的,我答得不好,问问大家怎么看

2460 次点击
所在节点    Java
6 条回复
546L5LiK6ZOt
2022-09-16 21:28:06 +08:00
我觉得这种很难通过理论分析来确定一个最优值的,可以先凭经验设置一个大概的参数,例如 30g 堆内存,再通过压测来不断调参,直到满足性能需求
chendy
2022-09-16 22:55:10 +08:00
24g ,预留 8g 给堆外内存
参数一个 Xms24g 一个 Xmx24g 再来一个 alwayspretouch ,心情好再给一个 eden 分一半
差点忘了 urandom

考量是虽然我们服务没人用,但是如果内存用的不够的话,基础设施会找我们收机器
git00ll
2022-09-16 23:01:01 +08:00
如果是我配置的话 cms 回收器,
xms26g xmx26g xmn10g -XX:MaxPermSize=3g ,新生代其实不需要设置特别大,不然 YGC 的时间会太长

g1 的话,配个最大值就好
ihehe
2022-09-17 07:52:26 +08:00
这个得先看部署什么应用了
kafka 这种的 jvm 给超过 8g 就是浪费,全靠 mmap 浪
还有其他一些高性能的都在堆外浪的,有的大部分在直接内存浪的;
xuanbg
2022-09-17 10:42:16 +08:00
堆设置多大,和机器内存多大有个半毛钱关系?肯定是需要多大设多大啊。内存多可以多跑几个 docker 容器,不是用来给你浪费的。
int0x03
2022-09-21 08:59:59 +08:00
对于这个问题, 很有可能是问关于 压缩指针 的问题.
对于 32 位系统, 理论最多 4G.
对于 64 位系统, 理论值非常大, 指针宽度是 64 位, 但是这样会导致系统消耗非常多内存, 我们的实际内存又不能完全用到 64 位内存.
Java 都是字节对齐的, 所以引用指针的最后 3 位一定是 000, 那么这 3 位没用到. 所以对于一个 32 位指针可以指明的空间, 实际我们只需要 29 位, 因为最后 3 位都是 0. 那么同理, 如果我们想使用 32 位指针, 并且最后 3 位也上, 那么其实可以把内存扩展到 32G (4 -> 8 -> 16 -> 32), (后边 3 位也补 0). 所以可以做到 虽然我们使用了 32G 内存, 这些内存指针可以在 32 位里保存. 压缩指针就是在使用内存 32G 以下时候, 系统的引用指针仍然使用 32 位. 这样系统的效率会更好.

实际的测试是大概 28G 以下, 压缩指针的效率远高于 非压缩指针(64 位).

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/880681

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX