﻿<?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-anchor110-文章分类-性能调优相关</title><link>http://www.blogjava.net/anchor110/category/45631.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 01 Dec 2014 05:41:28 GMT</lastBuildDate><pubDate>Mon, 01 Dec 2014 05:41:28 GMT</pubDate><ttl>60</ttl><item><title>java cpu高问题分析方法</title><link>http://www.blogjava.net/anchor110/articles/420528.html</link><dc:creator>小一败涂地</dc:creator><author>小一败涂地</author><pubDate>Mon, 24 Nov 2014 10:26:00 GMT</pubDate><guid>http://www.blogjava.net/anchor110/articles/420528.html</guid><wfw:comment>http://www.blogjava.net/anchor110/comments/420528.html</wfw:comment><comments>http://www.blogjava.net/anchor110/articles/420528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/anchor110/comments/commentRss/420528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/anchor110/services/trackbacks/420528.html</trackback:ping><description><![CDATA[<div>方法总结如下：<br />1、top查看耗CPU的java线程ID，假设线程ID为1987。<br />2、top -H -p 1987查看此进程下的所有线程，记录下耗CPU的JAVA线程ID，假如：12706。<br />3、jstack 1987 &gt; thread.dump，将进程当时的内存情况DUMP到一个文件中。<br />4、vi thread.dump，然后将线程ID12706转化为十六进制，即31A2，注意此处需要将所有大写字母小写化，即最终为：31a2，在thread.dump中查找31a2，即可定位到问题代码。</div><img src ="http://www.blogjava.net/anchor110/aggbug/420528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/anchor110/" target="_blank">小一败涂地</a> 2014-11-24 18:26 <a href="http://www.blogjava.net/anchor110/articles/420528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>监控系统服务和端口，异常时实现自动重启</title><link>http://www.blogjava.net/anchor110/articles/395939.html</link><dc:creator>小一败涂地</dc:creator><author>小一败涂地</author><pubDate>Fri, 01 Mar 2013 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/anchor110/articles/395939.html</guid><wfw:comment>http://www.blogjava.net/anchor110/comments/395939.html</wfw:comment><comments>http://www.blogjava.net/anchor110/articles/395939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/anchor110/comments/commentRss/395939.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/anchor110/services/trackbacks/395939.html</trackback:ping><description><![CDATA[详见：http://www.51testing.com/html/86/n-214186.html<br /><br />示例，监听ssh服务，如果停止则自动重启服务，步骤如下：<br />1、vi /etc/monit.d/sshd.monit。<br />2、撰写内容，如下：<br /><div>check process sshd with pidfile /var/run/sshd.pid<br />&nbsp;&nbsp;&nbsp; start program = "/etc/init.d/sshd start"<br />&nbsp;&nbsp;&nbsp; stop program = "/etc/init.d/sshd stop"<br />&nbsp;&nbsp;&nbsp; if failed port 22 protocol ssh then restart<br />&nbsp;&nbsp;&nbsp; if 5 restarts within 5 cycles then timeout</div>3、如果要设置monit的相关参数，比如多长时间检测一次，请修改/etc/monit.conf，示例文件如下：<br /><div>set daemon 300<br /><br />set logfile /var/log/monit.log<br />set idfile /var/monit/id<br />set statefile /var/monit/state<br /><br />set httpd port 2812 and use address 127.0.0.1<br />&nbsp;&nbsp;&nbsp; allow 127.0.0.1<br />&nbsp;&nbsp;&nbsp; allow surfront:surfront<br /><br />check system 127.0.0.1<br /><br />include /etc/monit.d/*.monit<br />4、重启monit服务，/etc/init.d/monit restart。<br />5、完毕，monit的相关日志位于/var/log/monit.log。</div><br /><img src ="http://www.blogjava.net/anchor110/aggbug/395939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/anchor110/" target="_blank">小一败涂地</a> 2013-03-01 17:08 <a href="http://www.blogjava.net/anchor110/articles/395939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql查看数据库连接数及状态</title><link>http://www.blogjava.net/anchor110/articles/391643.html</link><dc:creator>小一败涂地</dc:creator><author>小一败涂地</author><pubDate>Tue, 20 Nov 2012 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/anchor110/articles/391643.html</guid><wfw:comment>http://www.blogjava.net/anchor110/comments/391643.html</wfw:comment><comments>http://www.blogjava.net/anchor110/articles/391643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/anchor110/comments/commentRss/391643.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/anchor110/services/trackbacks/391643.html</trackback:ping><description><![CDATA[命令如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">mysqladmin&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">uroot&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">p123456&nbsp;status</span></div>注：Threads即为连接个数。<br /><img src ="http://www.blogjava.net/anchor110/aggbug/391643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/anchor110/" target="_blank">小一败涂地</a> 2012-11-20 15:02 <a href="http://www.blogjava.net/anchor110/articles/391643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用排错技巧</title><link>http://www.blogjava.net/anchor110/articles/391150.html</link><dc:creator>小一败涂地</dc:creator><author>小一败涂地</author><pubDate>Sat, 10 Nov 2012 12:32:00 GMT</pubDate><guid>http://www.blogjava.net/anchor110/articles/391150.html</guid><wfw:comment>http://www.blogjava.net/anchor110/comments/391150.html</wfw:comment><comments>http://www.blogjava.net/anchor110/articles/391150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/anchor110/comments/commentRss/391150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/anchor110/services/trackbacks/391150.html</trackback:ping><description><![CDATA[/var/log/messages，记录系统出错信息。<br />/var/log/monit.log，记录服务运行相关情况。<br />/tmp，mysql查询时产生的临时表默认会存放在这。当然，你可以手动修改/etc/my.cnf中tmpdir为另一位置。<img src ="http://www.blogjava.net/anchor110/aggbug/391150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/anchor110/" target="_blank">小一败涂地</a> 2012-11-10 20:32 <a href="http://www.blogjava.net/anchor110/articles/391150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql大数据量下修改表结构的方法</title><link>http://www.blogjava.net/anchor110/articles/361152.html</link><dc:creator>小一败涂地</dc:creator><author>小一败涂地</author><pubDate>Thu, 13 Oct 2011 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/anchor110/articles/361152.html</guid><wfw:comment>http://www.blogjava.net/anchor110/comments/361152.html</wfw:comment><comments>http://www.blogjava.net/anchor110/articles/361152.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/anchor110/comments/commentRss/361152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/anchor110/services/trackbacks/361152.html</trackback:ping><description><![CDATA[当表数据量是几百万条以上时，如果要修改原表结构，比如给原表加个列字段，同时在这个表上加索引。<br />请勿使用以下方式：<br /><div>alter table video_names add column type VARCHAR(255) NOT NULL, add index(type)</div><br />原因是：<br />经过实际测试，表数据量是800多万条，运行上述语句时，几个小时执行不完。<br /><br /><br />正确方式：<br />1、创建一个新表tmp_names<br />2、执行insert into tmp_names(****) select ***** from video_name;<br />3、删除video_names<br />4、重命名tmp_name为video_names;语句为rename table tmp_names to video_names;<img src ="http://www.blogjava.net/anchor110/aggbug/361152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/anchor110/" target="_blank">小一败涂地</a> 2011-10-13 15:17 <a href="http://www.blogjava.net/anchor110/articles/361152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM内存管理总结(注：转载于http://topic.csdn.net/u/20090602/10/bd9d4ba2-dbeb-49b3-8651-67c5de2b228a.html)</title><link>http://www.blogjava.net/anchor110/articles/330161.html</link><dc:creator>小一败涂地</dc:creator><author>小一败涂地</author><pubDate>Sun, 29 Aug 2010 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/anchor110/articles/330161.html</guid><wfw:comment>http://www.blogjava.net/anchor110/comments/330161.html</wfw:comment><comments>http://www.blogjava.net/anchor110/articles/330161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/anchor110/comments/commentRss/330161.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/anchor110/services/trackbacks/330161.html</trackback:ping><description><![CDATA[先看一看JVM的内部结构——<br />
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/Ant_Yan/EntryImages/20090520/a7413588-2618-3301-9eb4-e025e5afc2d8.png" alt="" /><br />
<br />
如
图所示，JVM主要包括两个子系统和两个组件。两个子系统分别是Class loader子系统和Execution engine(执行引擎)
子系统；两个组件分别是Runtime data area (运行时数据区域)组件和Native interface(本地接口)组件。<br />
&nbsp;<br />
Class
loader子系统的作用：根据给定的全限定名类名(如 java.lang.Object)来装载class文件的内容到 Runtime data
area中的method area(方法区域)。Java程序员可以extends
java.lang.ClassLoader类来写自己的Class loader。&nbsp; <br />
<br />
Execution
engine子系统的作用：执行classes中的指令。任何JVM specification实现(JDK)的核心都是Execution
engine，不同的JDK例如Sun 的JDK 和IBM的JDK好坏主要就取决于他们各自实现的Execution  engine的好坏。<br />
<br />
Native
interface组件：与native
libraries交互，是其它编程语言交互的接口。当调用native方法的时候，就进入了一个全新的并且不再受虚拟机限制的世界，所以也很容易出现
JVM无法控制的native heap OutOfMemory。<br />
<br />
Runtime Data Area组件：这就是我们常说的JVM的内存了。它主要分为五个部分——<br />
1、Heap (堆)：一个Java虚拟实例中只存在一个堆空间<br />
2、Method Area(方法区域)：被装载的class的信息存储在Method area的内存中。当虚拟机装载某个类型时，它使用类装载器定位相应的class文件，然后读入这个class文件内容并把它传输到虚拟机中。<br />
3、Java Stack(java的栈)：虚拟机只会直接对Java stack执行两种操作：以帧为单位的压栈或出栈<br />
4、Program Counter(程序计数器)：每一个线程都有它自己的PC寄存器，也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿地址，这里的地址可以是一个本地指针，也可以是在方法区中相对应于该方法起始指令的偏移量。&nbsp; <br />
5、Native method stack(本地方法栈)：保存native方法进入区域的地址<br />
<br />
以上五部分只有Heap 和Method Area是被所有线程的共享使用的；而Java stack, Program counter 和Native method stack是以线程为粒度的，每个线程独自拥有自己的部分。<br />
<br />
了解JVM的系统结构，再来看看JVM内存回收问题了——<br />
Sun的JVM Generational Collecting(垃圾回收)原理是这样的：把对象分为年青代(Young)、年老代(Tenured)、持久代(Perm)，对不同生命周期的对象使用不同的算法。(基于对对象生命周期分析)<br />
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/Ant_Yan/EntryImages/20090520/39bbb07d-fe97-3d9e-b55f-2f48a6d46395.png" alt="" /><br />
<br />
如上图所示，为Java堆中的各代分布。&nbsp; <br />
1. Young（年轻代）<br />
年
轻代分三个区。一个Eden区，两个Survivor区。大部分对象在Eden区中生成。当Eden区满时，还存活的对象将被复制到Survivor区
（两个中的一个），当这个Survivor区满时，此区的存活对象将被复制到另外一个Survivor区，当这个Survivor去也满了的时候，从第一
个Survivor区复制过来的并且此时还存活的对象，将被复制年老区(Tenured。需要注意，Survivor的两个区是对称的，没先后关系，所以
同一个区中可能同时存在从Eden复制过来
对象，和从前一个Survivor复制过来的对象，而复制到年老区的只有从第一个Survivor去过来的对象。而且，Survivor区总有一个是空
的。&nbsp; <br />
2. Tenured（年老代）<br />
年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。&nbsp; <br />
3. Perm（持久代）<br />
用
于存放静态文件，如今Java类、方法等。持久代对垃圾回收没有显著影响，但是有些应用可能动态生成或者调用一些class，例如Hibernate等，
在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。<br />
<br />
举
个例子：当在程序中生成对象时，正常对象会在年轻代中分配空间，如果是过大的对象也可能会直接在年老代生成（据观测在运行某程序时候每次会生成一个十兆的
空间用收发消息，这部分内存就会直接在年老代分配）。年轻代在空间被分配完的时候就会发起内存回收，大部分内存会被回收，一部分幸存的内存会被拷贝至
Survivor的from区，经过多次回收以后如果from区内存也分配完毕，就会也发生内存回收然后将剩余的对象拷贝至to区。等到to区也满的时
候，就会再次发生内存回收然后把幸存的对象拷贝至年老区。<br />
<br />
通常我们说的JVM内存回收总是在指堆内存回收，确实只有堆中的内容是动态申请分配的，所以以上对象的年轻代和年老代都是指的JVM的Heap空间，而持久代则是之前提到的Method Area，不属于Heap。<br />
<br />
了解完这些之后，以下的转载一热衷于钻研技术的哥们Richen Wang关于内存管理的一些建议——<br />
1、手动将生成的无用对象，中间对象置为null，加快内存回收。<br />
2、对象池技术 如果生成的对象是可重用的对象，只是其中的属性不同时，可以考虑采用对象池来较少对象的生成。如果有空闲的对象就从对象池中取出使用，没有再生成新的对象，大大提高了对象的复用率。<br />
3、JVM调优 通过配置JVM的参数来提高垃圾回收的速度，如果在没有出现内存泄露且上面两种办法都不能保证内存的回收时，可以考虑采用JVM调优的方式来解决，不过一定要经过实体机的长期测试，因为不同的参数可能引起不同的效果。如-Xnoclassgc参数等。<br />
<br />
推荐的两款内存检测工具<br />
1、
jconsole  JDK自带的内存监测工具，路径jdk
bin目录下jconsole.exe，双击可运行。连接方式有两种，第一种是本地方式如调试时运行的进程可以直接连，第二种是远程方式，可以连接以服务
形式启动的进程。远程连接方式是：在目标进程的jvm启动参数中添加-Dcom.sun.management.jmxremote.port=1090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
1090是监听的端口号具体使用时要进行修改，然后使用IP加端口号连接即可。通过该工具可以监测到当时内存的大小，CPU的使用量以及类的加载，还提供
了手动gc的功能。优点是效率高，速度快，在不影响进行运行的情况下监测产品的运行。缺点是无法看到类或者对象之类的具体信息。使用方式很简单点击几下就
可以知道功能如何了，确实有不明白之处可以上网查询文档。<br />
<br />
2、JProfiler
收费的工具，但是到处都有破解办法。安装好以后按照配置调试的方式配置好一个本地的session即可运行。可以监测当时的内存、CPU、线程等，能具体
的列出内存的占用情况，还可以就某个类进行分析。优点很多，缺点太影响速度，而且有的类可能无法被织入方法，例如我使用jprofiler时一直没有备份
成功过，总会有一些类的错误。<br />
<img src ="http://www.blogjava.net/anchor110/aggbug/330161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/anchor110/" target="_blank">小一败涂地</a> 2010-08-29 13:13 <a href="http://www.blogjava.net/anchor110/articles/330161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>