面试被问到我们的机器内存多大,我们的 jvm 参数怎么设置的,如果是 32g 的内存机器,堆应该设置多大比较合适,怎么考量的,我答得不好,问问大家怎么看
1
546L5LiK6ZOt 2022-09-16 21:28:06 +08:00
我觉得这种很难通过理论分析来确定一个最优值的,可以先凭经验设置一个大概的参数,例如 30g 堆内存,再通过压测来不断调参,直到满足性能需求
|
2
chendy 2022-09-16 22:55:10 +08:00
24g ,预留 8g 给堆外内存
参数一个 Xms24g 一个 Xmx24g 再来一个 alwayspretouch ,心情好再给一个 eden 分一半 差点忘了 urandom 考量是虽然我们服务没人用,但是如果内存用的不够的话,基础设施会找我们收机器 |
3
git00ll 2022-09-16 23:01:01 +08:00
如果是我配置的话 cms 回收器,
xms26g xmx26g xmn10g -XX:MaxPermSize=3g ,新生代其实不需要设置特别大,不然 YGC 的时间会太长 g1 的话,配个最大值就好 |
4
ihehe 2022-09-17 07:52:26 +08:00 via iPhone
这个得先看部署什么应用了
kafka 这种的 jvm 给超过 8g 就是浪费,全靠 mmap 浪 还有其他一些高性能的都在堆外浪的,有的大部分在直接内存浪的; |
5
xuanbg 2022-09-17 10:42:16 +08:00
堆设置多大,和机器内存多大有个半毛钱关系?肯定是需要多大设多大啊。内存多可以多跑几个 docker 容器,不是用来给你浪费的。
|
6
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 位). |