<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>-Flyぁ梦- &#187; 内存泄露</title>
	<atom:link href="http://blog.11034.org/tag/%e5%86%85%e5%ad%98%e6%b3%84%e9%9c%b2/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.11034.org</link>
	<description></description>
	<lastBuildDate>Sun, 22 Jun 2025 08:59:05 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>64位Linux下Java进程堆外内存迷之64M问题</title>
		<link>http://blog.11034.org/2016-09/64bits_linux_arena_memory.html</link>
		<comments>http://blog.11034.org/2016-09/64bits_linux_arena_memory.html#comments</comments>
		<pubDate>Fri, 09 Sep 2016 10:44:42 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[内存]]></category>
		<category><![CDATA[内存泄露]]></category>

		<guid isPermaLink="false">http://blog.11034.org/?p=2870</guid>
		<description><![CDATA[起因，监控系统检查到link机器内存耗尽，用top查看，果然有一个java进程占用了近24g内存（包括VIRT [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>起因，监控系统检查到link机器内存耗尽，用top查看，果然有一个java进程占用了近24g内存（包括VIRT和RES），但是启动java进程的参数是java -server -Xmx12g -Xms12g -XX:PermSize=50m，理论上只应该占用12g再多一些，所以问题就在这个进程了。此进程主要处理Socket IO读写，使用的是Java NIO。</p>
<p><span id="more-2870"></span></p>
<p><a href="http://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used" target="_blank">http://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used</a> 这里详细描述了top命令里内存显示的意义。</p>
<p>用jstat -gcutil $pid看，发现堆使用率却很低，甚至都没有怎么出现过Full GC，Young GC也很少，堆内存完全够用。<code class="markdown_inline_code">jmap -histo:live  $pid命令（注：此命令调用会先调用Full GC一次）</code>也看不出有任何对象占用内存很大的情况。</p>
<p>到这里据同事提醒，怀疑是堆外内存泄露。一般情况下是<code class="markdown_inline_code">ByteBuffer.allocateDirect()</code>这个API可以开辟堆外内存空间，但是搜索源代码并没有发现有这个调用。</p>
<p>然后据水寒同学提示，可以通过<code class="markdown_inline_code">cat /proc/$pid/maps</code>（也可以通过<code class="markdown_inline_code">pmap $pid</code>命令）来查看内存使用。然后就发现了问题：</p>
<ul>
<li>一大块内存正好是12g，应该就是通过-Xmx设置的内存，无标识符</li>
<li>有一块3.5g的内存，最后一列标识符是[heap]</li>
<li>有111块正好为64M或者非常接近64M的内存块，无标识符</li>
</ul>
<p>显然问题出在这111 * 64m = 6g这里，搜索源代码并没有发现有常量64的使用，一般代码也不会硬coding这么大一块内存呀。如果问题出在引用的某个第三方jar包就难定位问题了。</p>
<p>因为觉得这个64M内存块具有非常显著的特点，于是就通过Google和百度，找到如下：</p>
<pre class="markdown_pre"><code><a href="http://blog.2baxb.me/archives/918" target="_blank">http://blog.2baxb.me/archives/918</a>

<a href="https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage" target="_blank">https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage</a>

<a href="http://it.taocms.org/01/6808.htm" target="_blank">http://it.taocms.org/01/6808.htm</a>

<a href="https://infobright.com/blog/malloc_arena_max/" target="_blank">https://infobright.com/blog/malloc_arena_max/</a>

这几篇文章，尤其是ibm那篇文章讲的最细致，Linux glibc &gt;= 2.10 (RHEL 6) malloc may show excessive virtual memory usage。

大致意思是，这个版本的glibc控制的malloc函数，会在64位的Linux的中，给每一个CPU核开辟8个64M内存的缓冲区，用于提高性能。

然后这个问题也被Hadoop官方发现并指出，然后推荐控制环境变量MALLOC_ARENA_MAX=4来达到最优设置。

修改方法：启动java进程脚本前面加入，export MALLOC_ARENA_MAX=4</code></pre>
<h4  class="related_post_title">看看 linux , 内存 , 内存泄露</h4><ul class="related_post"><li>2015-08-28 -- <a target="_blank" href="http://blog.11034.org/2015-08/tomcat_linux.html" title="Linux下搭建Tomcat环境">Linux下搭建Tomcat环境</a></li><li>2015-08-12 -- <a target="_blank" href="http://blog.11034.org/2015-08/rails_nginx.html" title="Liunx下搭建Rails和Nginx环境">Liunx下搭建Rails和Nginx环境</a></li><li>2013-05-15 -- <a target="_blank" href="http://blog.11034.org/2013-05/fan_error.html" title="小黑风扇坏两天，被逼看完一本书">小黑风扇坏两天，被逼看完一本书</a></li></ul><h4 class="related_post_title">看看 Java </h4><ul class="related_post"><li>2016-08-18 -- <a target="_blank" href="http://blog.11034.org/2016-08/java_concurrency_in_practice.html" title="读java concurrency in practice">读java concurrency in practice</a></li><li>2016-08-05 -- <a target="_blank" href="http://blog.11034.org/2016-08/thread_stop.html" title="线程清理">线程清理</a></li><li>2016-06-21 -- <a target="_blank" href="http://blog.11034.org/2016-06/futuretask.html" title="FutureTask简单分析和用法">FutureTask简单分析和用法</a></li><li>2016-06-21 -- <a target="_blank" href="http://blog.11034.org/2016-06/semaphore.html" title="Semaphore简单分析">Semaphore简单分析</a></li><li>2016-06-17 -- <a target="_blank" href="http://blog.11034.org/2016-06/countdownlatch.html" title="CountDownLatch简单分析">CountDownLatch简单分析</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2016-09/64bits_linux_arena_memory.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
