[转帖]Java原生内存管理(native memory management)(5)-MALLOC_ARENA_MAX

java,原生,内存,管理,native,memory,management,malloc,arena,max · 浏览次数 : 0

小编点评

**MALLOC_ARENA_MAX**是一个Linux环境变量,用于控制提供给glibc的内存池的数量。默认值为8*CPU核数量。 **用法:** ```bash export MALLOC_ARENA_MAX=2glibc ``` **glibc与Java的关系:** * Java的glibc是Java的默认原生内存分配器。 * glibc分配出来内存的objects可能不会被返还给操作系统,好处是重复使用这些内存坏处,造成内存碎片潜在问题。 * 在使用多线程默认情况下,glibc会给每个线程提供一个新的128MB的“malloc arena”。 * 对于使用JVM堆外内存/原生内存的线程,使用MALLOC_ARENA_MAX并不会产生内存碎片。 **注意:** * 调试MALLOC_ARENA_MAX的数字是在效率和内存消耗之间做选择。 * 使用默认的MALLOC_ARENA_MAX能获得最佳效率,但可能消耗更多的内存。 * 减少MALLOC_ARENA_MAX能减少内存使用,但效率可能稍微低一些。

正文

https://zhuanlan.zhihu.com/p/423000502

 

这篇文章来说说和PhantomReference/finalize无关的东西 - MALLOC_ARENA_MAX. 这个东西只对Linux里的Java有用, 如果你在Linux上有内存耗尽(OOM, out of memory)的问题, 可以先调试一下MALLOC_ARENA_MAX看.

什么是MALLOC_ARENA_MAX?

MALLOC_ARENA_MAX是一个Linux环境变量, 用于控制提供给glibc的内存池的数量. 默认是 8 * CPU核的数量. 用法是在命令行里输入:

export MALLOC_ARENA_MAX=2

glibc又是什么?

glibc是Java的默认原生内存分配器(default native memory allocator).

Java的glibc和我又有什么关系?

1. 如果你在Java里用原生内存(native memory):

为了提升内存效率, glibc分配出来内存的objects可能不会被返还给操作系统.

好处: 这样可以重复使用这些内存

坏处: 造成很多内存碎片

潜在问题: 这些内存碎片会无限制的增长最后导致内存耗尽(OOM)

参考: 

2. 如果你在使用多线程

默认情况glibc会给每个线程提供一个新的128MB的"malloc arena"(是有上限的, 默认最多是8*处理器数量).

这个对于只有少量线程但是需要大量并行内存空间的情况是有好处的, 但是对于使用JVM堆外内存/原生内存的线程没好处. 因为分配的"malloc arena"也用不上, 它要用的是堆外的内存.

潜在问题: 虚拟内存大增. 对于有ulimit限制的程序, 在容器里的云应用, 嵌入式, 都需要小心调试MALLOC_ARENA_MAX, 试着减少它的数字.

参考: 

如何调试MALLOC_ARENA_MAX?

一般来说, 调试MALLOC_ARENA_MAX的数字就是在效率和内存消耗之间做选择. 使用默认的MALLOC_ARENA_MAX能获得最佳效率, 但是可能消耗更多的内存. 减少MALLOC_ARENA_MAX能减少内存使用, 但是效率可能稍微低一些.

通常我们把MALLOC_ARENA_MAX设为2或者4能达到比较好的效果同时不会有内存问题.

项目实例: 我们这边有一个比较大的Java项目一直把MALLOC_ARENA_MAX设为2, 否则就会内存不够用.

与[转帖]Java原生内存管理(native memory management)(5)-MALLOC_ARENA_MAX相似的内容:

[转帖]Java原生内存管理(native memory management)(5)-MALLOC_ARENA_MAX

https://zhuanlan.zhihu.com/p/423000502 这篇文章来说说和PhantomReference/finalize无关的东西 - MALLOC_ARENA_MAX. 这个东西只对Linux里的Java有用, 如果你在Linux上有内存耗尽(OOM, out of mem

[转帖]为什么说JVM是黑盒子般存在,从Java 虚拟机原理内存开始

https://maimai.cn/article/detail?fid=1739907745&efid=ALbQzkwOvQr-0GryeUzRsw 为什么要学习 JVM 在很多 Java 程序员的开发生涯里,JVM 一直是黑盒子一般的存在,大家只知道运行 Java 程序需要依靠 JVM,千篇一律

[转帖]JAVA 应用提速之 Large pages「译」

原文链接:https://mp.weixin.qq.com/s/HxT-DXNWkPCyDB6qAgKmXA 一、前言 我最近花了很多时间在 JVM 的内存预留代码上。它开始是因为我们得到了外部贡献,以支持在 Linux 上使用多个大小的 large page。为了以一种好的方式做到这一点,必须首先

[转帖]java性能分析之火焰图

http://t.zoukankan.com/lemon-le-p-13820204.html 原由 最近因为kafka、zookeeper、ES和相关的Java应用的内存问题搞的头大,做运维将近4年,对Java调优、性能方面的知识了解的少之又少,是时候下定决心来对他多一个学习了。不能一口吃成一个胖

[转帖]一次 Java 进程 OOM 的排查分析(glibc 篇)

https://juejin.cn/post/6854573220733911048 遇到了一个 glibc 导致的内存回收问题,查找原因和实验的的过程是比较有意思的,主要会涉及到下面这些: Linux 中典型的大量 64M 内存区域问题 glibc 的内存分配器 ptmalloc2 的底层原理 如

[转帖]一次 Java 进程 OOM 的排查分析(glibc 篇)

https://juejin.cn/post/6854573220733911048 遇到了一个 glibc 导致的内存回收问题,查找原因和实验的的过程是比较有意思的,主要会涉及到下面这些: Linux 中典型的大量 64M 内存区域问题 glibc 的内存分配器 ptmalloc2 的底层原理 如

[转帖]高手总结的9种 OOM 常见原因及解决方案

https://zhuanlan.zhihu.com/p/79355050 当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。 1、Java heap space 当

[转帖]一个用于辅助分析‘Java内存泄露’的小工具

https://www.jianshu.com/p/658cb6cbfe61 histo对比工具 这是一个用于辅助分析‘Java内存泄露’的小工具 源码地址 实现原理 分析fgc前后的类实例对象分布变化来辅助判断 如果多次fgc后,一个类的对象实例没有发生变化或者越来越多,则需要重点排查 操作步骤

[转帖]Cat导致内存不足原因分析

背景 线上几亿的数据在回刷的时候容器服务会出现OOM而重启,导致任务中断 内存泄露分析 jmap -histo pid 找出了有几十亿的java.lang.StackTraceElement对象,找不到被谁引用了 jmap -dump:format=b,file=heapdump.hprof pid

[转帖]JVM 系列 - 内存区域

一、对象在JVM中的表示: OOP-Klass模型 https://www.jianshu.com/p/424a920771a3 写的很赞。 注意:OOP-Klass是hotspot的JVM实现原理,其他JVM的实现可能不一样。、 OOP表示java实例,Klass表示class。 Klass: 包