<?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; linux</title>
	<atom:link href="http://blog.11034.org/tag/linux/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>
		<item>
		<title>Linux下搭建Tomcat环境</title>
		<link>http://blog.11034.org/2015-08/tomcat_linux.html</link>
		<comments>http://blog.11034.org/2015-08/tomcat_linux.html#comments</comments>
		<pubDate>Fri, 28 Aug 2015 07:21:34 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://blog.11034.org/?p=2507</guid>
		<description><![CDATA[多年没有碰Java Web了，之前也一直在Windows下玩耍。在Linux下跑起Tomcat也折腾了一阵。  [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>多年没有碰Java Web了，之前也一直在Windows下玩耍。在Linux下跑起Tomcat也折腾了一阵。</p>
<p>看Apache Tomcat官网，已经有Tomcat 8.x（据说支持Oracle Java 7.0标准），7.x和6.x，习惯还是使用6.0.44版本。</p>
<p><span id="more-2507"></span></p>
<h2>设置环境变量</h2>
<p>打开<code class="markdown_inline_code">~/.profile</code>文件，或者/etc/profile文件</p>
<pre class="markdown_pre"><code>JAVA_HOME=/usr/.../java
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
CATALINA_HOME=/home/.../tomcat
export JAVA_HOME PATH CLASSPATH CATALINA_HOME</code></pre>
<p>使用<code class="markdown_inline_code">source ~/.profile</code>命令重新加载文件（或重新登陆ssh即可），查看命令<code class="markdown_inline_code">echo $JAVA_HOME</code></p>
<h2>给Tomcat脚本加执行权限</h2>
<p>进入<code class="markdown_inline_code">$CATALINA_HOME/bin</code>，<code class="markdown_inline_code">chmod +x *.sh</code></p>
<p>然后<code class="markdown_inline_code">./startup.sh</code>，应该就能启动了</p>
<p>启动成功显示：</p>
<pre class="markdown_pre"><code>Using CATALINA_BASE: /home/.../apache-tomcat-6.0.44
Using CATALINA_HOME: /home/.../apache-tomcat-6.0.44
Using CATALINA_TMPDIR: /home/.../apache-tomcat-6.0.44/temp
Using JRE_HOME: /usr/.../java
Using CLASSPATH: /home/.../apache-tomcat-6.0.44/bin/bootstrap.jar</code></pre>
<p>用netstat -ntlp显示：</p>
<pre class="markdown_pre"><code>tcp6 0 0 :::8009 :::* LISTEN 25424/java    # AJP服务
tcp6 0 0 :::8080 :::* LISTEN 25424/java    # HTTP服务
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 25424/java  # 关闭命令接收服务</code></pre>
<p>修改Tomcat启动端口，在conf/server.xml，修改<code class="markdown_inline_code">Connector port="8080"</code>中的端口号即可</p>
<h2>以根目录启动</h2>
<p>可以在conf/server.xml中，修改Host标签中添加一行，docBase指向含有WEB-INF的目录即可</p>
<p><code class="markdown_inline_code">&lt;Context path="" docBase="/home/.../app" debug="0" reloadable="true" /&gt;</code></p>
<h4  class="related_post_title">看看 linux , Tomcat</h4><ul class="related_post"><li>2016-09-09 -- <a target="_blank" href="http://blog.11034.org/2016-09/64bits_linux_arena_memory.html" title="64位Linux下Java进程堆外内存迷之64M问题">64位Linux下Java进程堆外内存迷之64M问题</a></li><li>2016-06-08 -- <a target="_blank" href="http://blog.11034.org/2016-06/tomcat_shutdown.html" title="Tomcat监听shutdown释放数据库连接池">Tomcat监听shutdown释放数据库连接池</a></li><li>2016-06-06 -- <a target="_blank" href="http://blog.11034.org/2016-06/tomcat_https.html" title="Tomcat启用https服务">Tomcat启用https服务</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-20 -- <a target="_blank" href="http://blog.11034.org/2013-05/coyote.html" title="Tomcat的Connector：Coyote">Tomcat的Connector：Coyote</a></li></ul><h4 class="related_post_title">看看 Java </h4><ul class="related_post"><li>2016-09-09 -- <a target="_blank" href="http://blog.11034.org/2016-09/64bits_linux_arena_memory.html" title="64位Linux下Java进程堆外内存迷之64M问题">64位Linux下Java进程堆外内存迷之64M问题</a></li><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>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2015-08/tomcat_linux.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Liunx下搭建Rails和Nginx环境</title>
		<link>http://blog.11034.org/2015-08/rails_nginx.html</link>
		<comments>http://blog.11034.org/2015-08/rails_nginx.html#comments</comments>
		<pubDate>Wed, 12 Aug 2015 05:21:26 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://blog.11034.org/?p=2504</guid>
		<description><![CDATA[用rails开发轻量级web，效率最高！ 安装rvm http://www.rvm.io/ \curl -sS [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>用rails开发轻量级web，效率最高！</p>
<p><span id="more-2504"></span></p>
<h2>安装rvm</h2>
<p><code class="markdown_inline_code">http://www.rvm.io/</code></p>
<pre class="markdown_pre"><code>\curl -sSL https://get.rvm.io | bash -s stable

echo "source $HOME/.rvm/scripts/rvm" &gt;&gt; ~/.bash_profile

source /etc/profile

然后就可以在命令行中使用rvm命令了</code></pre>
<h2>安装ruby</h2>
<p>安装rvm后安装ruby下载缓慢，手动在ruby.taobao.org下载ruby-1.9.3，将安装包放在rvm/archives下即可</p>
<p><code class="markdown_inline_code">rvm install 1.9.3-p545</code> （如果不指定p版本，则不一定会使用安装包，而去下载网上最新版本）</p>
<p><code class="markdown_inline_code">which ruby</code> 可以找到当前版本ruby版本和位置</p>
<p>按照http://ruby.taobao.org/的方法，将gem的source改为<code class="markdown_inline_code">https://ruby.taobao.org/</code></p>
<p>这里要大大赞一下taobao，为国内开发者提供了便利，然后严重鄙视和谴责GFW</p>
<pre class="markdown_pre"><code>gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem sources -l
*** CURRENT SOURCES ***

https://ruby.taobao.org
# 请确保只有 ruby.taobao.org</code></pre>
<h2>安装mysql</h2>
<p><code class="markdown_inline_code">apt-get install mysql-server</code></p>
<p><code class="markdown_inline_code">apt-get install libmysqlclient-dev</code></p>
<p><code class="markdown_inline_code">gem install mysql2 -v=0.2.24</code> <code class="markdown_inline_code">gem install activerecord-mysql2-adapter</code></p>
<h2>安装rails</h2>
<p><code class="markdown_inline_code">gem install rails -v=3.0.20</code> 3.2版本以上使用了很多新的东西，包括要安装nodejs等环境比较麻烦</p>
<p><code class="markdown_inline_code">rails new demo --skip-bundle</code></p>
<pre class="markdown_pre"><code>如果提示缺少必要gem的话，可以使用bundle自动安装
cd demo
bundle config mirror.https://rubygems.org https://ruby.taobao.org
bundle install</code></pre>
<p><code class="markdown_inline_code">rails server</code>或者<code class="markdown_inline_code">rails s</code> 即可启动自带的WEBrick web server</p>
<h2>rails连接mysql</h2>
<p>在mysql中新建数据库</p>
<p>修改<code class="markdown_inline_code">config/database.yml</code></p>
<p>将adapter类型修改为<code class="markdown_inline_code">mysql2</code></p>
<pre class="markdown_pre"><code>production:
adapter: mysql2
database: db_name
username: db_user
password: db_pawd
host: 127.0.0.1
encoding: utf8
socket: /var/run/mysqld/mysqld.sock</code></pre>
<p>修改demo/Gemfile，注释#gem &#8216;sqlite3&#8217;，添加<code class="markdown_inline_code">gem 'mysql2', '&lt; 0.3'</code></p>
<p>然后写一个最简单的migrate文件用以测试，执行<code class="markdown_inline_code">RAILS_ENV=production db:migrate</code></p>
<p>不成功的原因：<br />
若提示无法加载libmysqlclient.18.dylib，是因为/usr/lib下没有这个文件，作一个软链接即可，前提是找到本机mysql安装位置：<br />
<code class="markdown_inline_code">ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib</code></p>
<h2>安装pcre和nginx</h2>
<p>源码安装，将nginx包解压到/opt/nginx-x.x.x后，不要将/opt/nginx-x.x.x改名为/opt/nginx，因为/opt/nginx目录会在编译后自动生成。然后不要删除源码目录，安装Passenger还会用到。</p>
<p><code class="markdown_inline_code">这里不需要自己编译安装Nginx</code>，因为安装Passenger的时候会需要编译安装一次</p>
<p>安装PCRE：<code class="markdown_inline_code">apt-get install libpcre3 libpcre3-dev</code></p>
<pre class="markdown_pre"><code>若自己编译nginx，方法如下：
./configure --prefix='/opt/nginx' --with-http_stub_status_module --with-http_sub_module --with-md5='/usr/lib' --with-sha1='/usr/lib --with-http_gzip_static_module' --with-http_ssl_module --with-cc-opt=-Wno-error --with-http_secure_link_module
# 若是手动编译安装PCRE，则需要加上 --with-pcre=/opt/pcre-8.36
make
make install
然后/opt/nginx目录就出来啦，安装完毕</code></pre>
<h2>安装Passenger</h2>
<p>首先是<code class="markdown_inline_code">gem install passenger</code> ，</p>
<p>然后进到gem的Passenger/bin目录中（可能在/usr/local/rvm/gems/ruby-1.9.3-p551/gems/passenger-5.0.16/），执行<code class="markdown_inline_code">passenger-install-nginx-module</code>脚本，选择第二种自定义安装nginx（第一种自动下载、编译、安装nginx），通过命令行输入nginx源码目录即可，之后都默认。</p>
<p>最后按照安装Passenger完毕给予的提示，配置nginx的conf/nginx.conf。</p>
<pre class="markdown_pre"><code>http {
passenger_root /usr/local/rvm/gems/ruby-1.9.3-p551/gems/passenger-5.0.16;
passenger_ruby /usr/local/rvm/gems/ruby-1.9.3-p551/wrappers/ruby;

server {
listen 80;
server_name localhost;
passenger_enabled on;
rails_env production;

location / {
root rails_project/public;
}
}
}</code></pre>
<h4  class="related_post_title">看看 linux , MySQL , nginx</h4><ul class="related_post"><li>2016-09-09 -- <a target="_blank" href="http://blog.11034.org/2016-09/64bits_linux_arena_memory.html" title="64位Linux下Java进程堆外内存迷之64M问题">64位Linux下Java进程堆外内存迷之64M问题</a></li><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>2013-06-23 -- <a target="_blank" href="http://blog.11034.org/2013-06/shida.html" title="院版十大了，那就XYT一下~">院版十大了，那就XYT一下~</a></li><li>2011-03-15 -- <a target="_blank" href="http://blog.11034.org/2011-03/spring_hibernate_annotation.html" title="SpringMVC+Hibernate的一些配置">SpringMVC+Hibernate的一些配置</a></li></ul><h4 class="related_post_title">看看 ruby on rails </h4><ul class="related_post"><li>2015-04-09 -- <a target="_blank" href="http://blog.11034.org/2015-04/json_ascii.html" title="JSON中出现解析错误的原因之一：不可打印字符">JSON中出现解析错误的原因之一：不可打印字符</a></li><li>2014-12-21 -- <a target="_blank" href="http://blog.11034.org/2014-12/ruby_encoding.html" title="Ruby字符串的编码">Ruby字符串的编码</a></li><li>2014-10-25 -- <a target="_blank" href="http://blog.11034.org/2014-10/linux_timeout.html" title="linux的timeout处理wkhtmltopdf进程超时">linux的timeout处理wkhtmltopdf进程超时</a></li><li>2014-10-04 -- <a target="_blank" href="http://blog.11034.org/2014-10/rails-has_many.html" title="Rails中has_many等的原理">Rails中has_many等的原理</a></li><li>2014-07-28 -- <a target="_blank" href="http://blog.11034.org/2014-07/active_support_235.html" title="简析Rails：active_support 2.3.5">简析Rails：active_support 2.3.5</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2015-08/rails_nginx.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
