﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-zhangxl_blog-文章分类-优化</title><link>http://www.blogjava.net/zhanglongsr/category/48902.html</link><description>路漫漫其修远兮，吾将上下而求索！</description><language>zh-cn</language><lastBuildDate>Tue, 19 Mar 2013 04:18:50 GMT</lastBuildDate><pubDate>Tue, 19 Mar 2013 04:18:50 GMT</pubDate><ttl>60</ttl><item><title>tomcat 产生heapdump文件配置 </title><link>http://www.blogjava.net/zhanglongsr/articles/396607.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Mon, 18 Mar 2013 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/396607.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/396607.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/396607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/396607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/396607.html</trackback:ping><description><![CDATA[<div class="blog_title">
<h3>&nbsp;</h3></div>
<div id="blog_content" class="blog_content">
<p><span style="font-size: small"><span style="white-space: pre"></span><font size="2">系统有时会遇到OutOfMemoryError，Java堆溢出了。我们需要找到造成OutOfMemoryError原因。一般有两种情况：</font></span></p>
<p><span style="font-size: small"><font size="2">1、内存泄露，对象已经死了，无法通过垃圾收集器进行自动回收；</font></span></p>
<p><span style="font-size: small"><font size="2">2、内存溢出，内存中的对象都还必须存活着，这说明Java堆分配空间不足，检查堆设置大小（-Xmx与-Xms），检查代码是否存在对象生命周期太长、持有状态时间过长的情况。</font></span></p>
<p><span style="font-size: small"><br /><font size="2"></font></span></p>
<p><span style="font-size: small"><span style="white-space: pre"></span><font size="2">想在泄漏未发生前，取堆转储文件分析， 通过jvm参数-XX:+HeapDumpOnOutOfMemoryError（XX:+HeapDumpOnCtrlBreak不知道为什么tomcat启动不了）可以让JVM在出现内存溢出是Dump出当前的内存转储快照。</font></span></p>
<p><span style="font-size: small"><font size="2">当然也可以通过用jmap生产dump文件。windows通过任务管理器查看tomcat的进程pid，linux用ps命令查看进程pid，然后用jmap命令（Java5：jmap -heap:format=b &lt;pid&gt;；Java6：jmap -dump:format=b,file=HeapDump.bin &lt;pid&gt;）</font></span></p>
<p>&nbsp;</p>
<h1><span style="font-size: small"><font size="2">在tomcat中设置jvm参数</font></span></h1>
<h2><span style="font-size: small"><font size="2">linux系统中</font></span></h2>
<p><span style="font-size: small"><font size="2">1.打开/tomcat_home/bin/catalina.sh文件&nbsp;</font></span></p>
<p><span style="font-size: small"><font size="2">2.加上：JAVA_OPTS="$JAVA_OPTS -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump"</font></span></p>
<p><span style="font-size: small"><font size="2">如下图位置：</font></span></p>
<p><font size="2"><img class="magplus" title="点击查看原始大小图片" alt="" src="http://dl.iteye.com/upload/attachment/0070/3154/594311f0-8c2c-3fd0-8def-4b1fe6d1f5a0.gif" width="700" height="129" /></font></p>
<p><span style="font-size: small"><font size="2">注：其中不设-XX:HeapDumpPath时，dump出的文件在/tomcat_home/bin目录下</font></span></p>
<h2><span style="font-size: small"><font size="2">Windows系统中</font></span></h2>
<p><span style="font-size: small"><font size="2">1.打开/tomcat_home/bin/catalina.bat文件</font></span></p>
<p><span style="font-size: small"><font size="2">2.加上：set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump</font></span></p>
<p><span style="font-size: small"><font size="2">如下图位置：</font></span></p>
<p><font size="2"><img class="magplus" title="点击查看原始大小图片" alt="" src="http://dl.iteye.com/upload/attachment/0070/3156/fc0ba3fc-e1a1-3ad5-a3a2-8bb619800a9c.gif" width="700" height="110" /></font></p>
<p><span style="font-size: small"><font size="2">&nbsp;</font></span></p>
<p><span style="font-size: small"><strong><font size="2">分析dump出来的内存快照文件</font></strong></span></p>
<p><span style="font-size: small"><br /><font size="2"></font></span></p>
<p><span style="font-size: small"><font size="2">可以使用分析工具进行分析，如：</font></span></p>
<p><span style="font-size: small"><font size="2">&nbsp;</font></span></p>
<p><span style="font-size: small"><strong><font size="2">Eclipse的MAT</font></strong></span></p>
<p><span style="font-size: small"><font size="2">下载地址：http://www.eclipse.org/mat/downloads.php</font></span></p>
<p><span style="font-size: small"><font size="2">说明文档：http://www.vogella.com/articles/EclipseMemoryAnalyser/article.html#example_project</font></span></p>
<p>&nbsp;</p>
<p>注意：解析过大的HeapDump可能导致Eclipse抛出OutOfMemory的错误。这时你需要手动调整Eclipse的缓存大小，可以参考官网给出的处理方式（<a href="http://wiki.eclipse.org/MemoryAnalyzer/FAQ#Out_of_Memory_Error_while_Running_the_Memory_Analyzer" target="_blank">原文连接</a>）</p>
<p>&nbsp;</p>
<p style="text-align: left; line-height: 24px; margin-top: 0.4em; font-family: Arial, sans-serif; margin-bottom: 10px; font-size: medium">Alternatively, edit the&nbsp;<code style="background-color: #f9f9f9">MemoryAnalyzer.ini</code>&nbsp;to contain:</p>
<blockquote style="text-align: left; line-height: 24px; font-family: Arial, sans-serif; font-size: medium">-vmargs<br />-Xmx2g<br />-XX:-UseGCOverheadLimit</blockquote>
<p><span style="font-size: small"><font size="2">Eclipse插件版打不开的朋友可以试试 RPC版的MAT&nbsp;（<span style="color: #ff0000">我的232m的dump文件也打不开，难道非得用64bit的机器吗？</span>）：RPC版MAT</font><a href="http://www.eclipse.org/mat/downloads.php" target="_blank"><font size="2">下载地址</font></a><font size="2"> 。</font></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><strong><font size="2">JProfile</font></strong></span></p>
<p><span style="font-size: small"><font size="2">&nbsp;</font></span></p>
<p><span style="font-size: small"><font size="2">等等；<br /><br />转自：<a href="http://jiangsha.iteye.com/blog/1576355">http://jiangsha.iteye.com/blog/1576355</a></font></span></p></div><img src ="http://www.blogjava.net/zhanglongsr/aggbug/396607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2013-03-18 16:53 <a href="http://www.blogjava.net/zhanglongsr/articles/396607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM性能参数调整介绍</title><link>http://www.blogjava.net/zhanglongsr/articles/352815.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Wed, 22 Jun 2011 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/352815.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/352815.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/352815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/352815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/352815.html</trackback:ping><description><![CDATA[<div><strong>JVM内部体系结构<br /></strong><br />
<div align="center"><img height="426" alt="" src="http://www.blogjava.net/images/blogjava_net/zhanglongsr/jvm.jpg" width="577" border="0" longdesc="" /></div><br />Sun JDK在实现时遵照JVM规范，将内存空间划分为方法区、堆、本地方法栈、PC寄存器、jvm方法栈。<br /><strong>方法区<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;方法区主要存放要加载的类的信息，比如类的名称、类的修饰符、类中的静态变量、final类型的常量、field、method等信息。方法区是线程共享的，在一定条件下也会被GC,当方法区要使用的内存超过其允许的大小时，会抛出OutOfMemory的错误信息。<br />&nbsp;&nbsp;&nbsp; 方法区的存储区域对应Permanet Generation(又称，持久代)，其默认值为{16MB-64MB},它的大小可以通过如下选项进行调整：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最小值<span style="color: red">：-XX:PermSize</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大值<span style="color: red">：-XX:MaxPermSize</span><br /><strong>堆<br /></strong>&nbsp;&nbsp;&nbsp; 堆用于存储新创建的对象和数组。其大小可以通过如下选项进行调整：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最小值<span style="color: red">：-Xms</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大值<span style="color: red">：-Xmx</span><br />&nbsp;&nbsp;&nbsp;&nbsp;为了让内存回收更有效率，Sun JDK从1.2开始对堆采用分代管理的方式。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u><strong>&nbsp;heap</strong> = <strong>New Generation</strong> (新生代)+ <strong>Old Generation</strong>（旧生代）<br /></u>&nbsp;&nbsp;&nbsp;&nbsp;其中，New Generation又可以分为<strong>Eden Space</strong>和<strong>Survivor Space</strong>，而Survivor Space由两块大小相同的区域组成(通常称为S0、S1)。那么，Eden Space、S0、S1用途上有什么区别吗？先来说说Eden Space，由于堆是线程共享的，因此在堆上分配内存是需要加锁的，这就导致创建对象开销增大，Sun JDK为了提升内存分配的效率，会为每个线程在新生代的Eden Space上分配一块独立的空间，这块空间叫做TLAB(Thread Local Allocation Buffer)，因此Eden Space是多个线程独享的连续的内存区域，在一个线程内创建对象，JVM首先考虑在Eden Space的TLAB上分配，如果对象过大或者TLAB空间已用完，那么将在堆上分配。S0、S1也用于新创建对象的存储，他们的另外一个用途是在GC时的临时复制空间。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新生代大小值<span style="color: red">：-Xmn</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Survivor Space大小<span style="color: red">：-XX：SurvivorRatio</span><br />&nbsp;&nbsp;&nbsp;&nbsp;旧生代主要存放多次GC后仍然存活的对象，不过，新建的对象也有可能在旧生代上分配。一种是大对象（-XX：PretenureSizeThreshold来确定），另一种是大数组，且数组未引用外部对象。旧生代大小：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;旧生代大小值=-<span style="color: red">Xmx 减去 -Xmn</span><br /><strong>JVM方法栈<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;JVM方法栈是线程私有的，其在内存分配上非常高效。当JVM方法栈空间不足时，会抛出StackOverflowError的错误。JVM方法栈可通过如下选项进行调整：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM方法栈大小<span style="color: red">：-Xss</span><br /><br /><br /></div><img src ="http://www.blogjava.net/zhanglongsr/aggbug/352815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2011-06-22 16:17 <a href="http://www.blogjava.net/zhanglongsr/articles/352815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>