V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
badboy17
V2EX  ›  Java

jvm 堆大小,蚂蚁面试

  •  
  •   badboy17 · 2022-09-16 21:16:02 +08:00 · 2704 次点击
    这是一个创建于 800 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    g1 的话,配个最大值就好
    ihehe
        4
    ihehe  
       2022-09-17 07:52:26 +08:00 via iPhone
    这个得先看部署什么应用了
    kafka 这种的 jvm 给超过 8g 就是浪费,全靠 mmap 浪
    还有其他一些高性能的都在堆外浪的,有的大部分在直接内存浪的;
    xuanbg
        5
    xuanbg  
       2022-09-17 10:42:16 +08:00
    堆设置多大,和机器内存多大有个半毛钱关系?肯定是需要多大设多大啊。内存多可以多跑几个 docker 容器,不是用来给你浪费的。
    int0x03
        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 位).
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3805 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:37 · PVG 18:37 · LAX 02:37 · JFK 05:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.