开发者社区> 问答> 正文

为什么明明内存很充足但是 java 程序仍申请不到内存?

有一台 8G 内存的实例,剩余内存还很多(7G 左右),而 java 程序使用了 4G 内存申请,直接抛出 OOM。

展开
收起
令人无语的八阿哥 2021-10-12 17:27:57 934 0
2 条回答
写回答
取消 提交回答
  • 遇到的相同情况,排查如下

    image.png

    oom 的记录显示为申请 4g 内存失败。

    4294967296/1024/1024=4096M

    1. 第一反应是想起来之前的vm.min_free_kbytes&nr_hugepage导致的free大于available的情况有关。

    image.png

    image.png

    1. free –m && sysctl –p && /proc/meminfo 等信息分析问题。

    HugePages_Total为 0说明没有设置 nr_hugepage。

    MemAvailable: 7418172kB说明这么多内存可用。

    image.png

    image.png

    image.png

    1. 实际上面的 meminfo 已经说明了问题,但是由于经验不足,一时没有看明白怎么回事,尝试自行测试。

    使用 java 命令,去申请超出我的测试机物理内存尝试,拿到报错。

    image.png

    image.png

    image.png

    image.png

    1. java 测试证明正常申请内存不会有问题,超额的内存才会 oom,那么为什么超额呢,视线回归到 sysctl -p 有所发现。

    image.png

    1. 两相对照,说明客户设置的 vm.overcommit_memory 在生效,建议改回 0 再试试。

    image.png

    资料来源:电子书《ECS运维指南之Linux系统诊断》,下载链接:https://developer.aliyun.com/topic/download?id=143

    2021-10-12 18:02:23
    赞同 展开评论 打赏
  • 遇到的相同情况,排查如下

    image.png

    oom 的记录显示为申请 4g 内存失败。

    4294967296/1024/1024=4096M

    1、第一反应是想起来之前的vm.min_free_kbytes&nr_hugepage导致的free大于available的情况有关。

    image.png

    image.png

    2、free –m && sysctl –p && /proc/meminfo 等信息分析问题。

    HugePages_Total为 0说明没有设置 nr_hugepage。

    MemAvailable: 7418172kB说明这么多内存可用。

    image.png

    image.png

    image.png

    3、实际上面的 meminfo 已经说明了问题,但是由于经验不足,一时没有看明白怎么回事,尝试自行测试。

    使用 java 命令,去申请超出我的测试机物理内存尝试,拿到报错。

    image.png

    image.png

    image.png

    image.png

    4、java 测试证明正常申请内存不会有问题,超额的内存才会 oom,那么为什么超额呢,视线回归到 sysctl -p 有所发现。

    image.png

    5、两相对照,说明客户设置的 vm.overcommit_memory 在生效,建议改回 0 再试试。

    image.png

    资料来源:电子书《ECS运维指南之Linux系统诊断》,下载链接:https://developer.aliyun.com/topic/download?id=143

    2021-10-12 18:02:23
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何通过 Serverless 提高 Java 微服务治理效 立即下载
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载