有一台生产环境的CPU占用率达到了100%,想分析一下是什么问题,如果用传统的线程分析会比较繁琐,需要记录pid,再转16进制,用jstack进行分析,如果要一直监控,就要一直重复输入,非常累人,于是我在github上找到个好用的工具

,下面介绍如何使用。

工具GitHub:点我访问

一、在服务器上下载工具

wget --no-check-certificate https://github.com/oldratlee/useful-scripts/archive/release-2.x.zip

unzip release-2.x.zip

解压出来后,先放置在那,先看看我们服务器上有没有配$JAVA_HOME环境变量。

二、配置JAVA_HOME环境变量

先确认你的JDK安装路径,比如我的路径是 /usr/java/jdk1.6.0_45/,记住该路径,接着

sudo vim /etc/profile

添加以下配置:

export JAVA_HOME=/usr/java/jdk1.6.0_45
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

ctrl+c后输入:wq保存,再输入

source /etc/profile

使配置生效,这样就可以使用show-busy-java-threads工具了。进到刚才解压好的工具目录下,

cd /解压好的目录/bin
show-busy-java-threads

就会显示排行前5的占用CPU利用率的线程栈,从中可以看到哪块代码引起的CPU占用,如:

"[ACTIVE] ExecuteThread: '36' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007f5adc02b800 nid=0x4494 runnable [0x00007f58ef1ee000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at oracle.net.ns.Packet.receive(Packet.java:293)
        at oracle.net.ns.DataPacket.receive(DataPacket.java:92)
        at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:174)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:119)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:94)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:79)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:112)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:73)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1040)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1016)
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:588)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:953)
        at oracle.jdbc.driver.OraclePreparedStatement.executeForRowsWithTimeout(OraclePreparedStatement.java:9253)
        at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9353)
        - locked <0x000000071aa6c400> (a oracle.jdbc.driver.T4CConnection)
        at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:211)
        at weblogic.jdbc.wrapper.PreparedStatement.executeBatch(PreparedStatement.java:191)
        at com.primeton.ext.infra.connection.StatementWrapper.executeBatch(StatementWrapper.java:239)
        at com.primeton.das.entity.impl.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:49)
        at com.primeton.das.entity.impl.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:254)
        at com.primeton.das.entity.impl.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
        at com.primeton.das.entity.impl.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
        at com.primeton.das.entity.impl.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at com.primeton.das.entity.impl.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at com.primeton.das.entity.impl.hibernate.impl.SessionImpl.flush(SessionImpl.java:1021)
        at com.primeton.das.entity.impl.DASSessionImpl.updateEntity(DASSessionImpl.java:650)
        at com.eos.foundation.database.DatabaseUtil.updateEntity(DatabaseUtil.java:259)
        at com.hymake.valentine.ep.housesale.contract.Contractbiz.
addContract
_biz.invokePojo14(addContract_biz.java:1560) at com.hymake.valentine.ep.housesale.contract.Contractbiz.addContract_biz._invoke(addContract_biz.java:3361) at com.hymake.valentine.ep.housesale.contract.Contractbiz.addContract_biz.invoke(addContract_biz.java:3927) at com.primeton.engine.core.impl.process.BLProxy.invoke(BLProxy.java:364) at com.primeton.engine.component.impl.OperationAccessor.invoke(OperationAccessor.java:237) at com.primeton.engine.component.impl.OperationAccessor.invoke(OperationAccessor.java:213) at com.primeton.ext.engine.component.Operation.invoke(Operation.java:185) at com.primeton.engine.component.impl.LogicCompoment.invoke(LogicCompoment.java:287)

如以上代码就是在addContract这里引起的。

Last modification:September 30, 2020
If you think my article is useful to you, please feel free to appreciate