一个Tomcat高CPU占用问题的定位

前段时间项目(交接过来的)发布了一个大的版本以后,IDC机器CPU不时会突然飙升,而且是“根本停不下来”的样子,一上去了就是100%。想来也纳闷,虽然发了版本,但没有太耗CPU的功能,不应该会让CPU一下子从20%左右飙升到100%,而且是间歇性的,想想也应该是项目本身固有的bug,只不过现在访问量大了才暴露出来。

 

先top命令看看是哪个进程当用了大量的CPU,得到pid,继续top -H -p [pid]找出此进程中CPU占用排在前头的活动线程,把pid都记录下来。[......]

Read more

Posted in Java | Tagged | Leave a comment

Tomcat源码走读2:启动过程

之前说到tomcat启动的入口是org.apache.catalina.startup.Bootstrap:

public static void main (String args[]) {

        if (daemon == null) {
            // Don't set daemon until init() has completed
            Bootstrap bootstrap = new Bootstrap();[......]

Read more

Posted in J2EE | Tagged | Leave a comment

Tomcat源码走读1:从何开始

最近想将Tomcat各个部分的实现原理好好的整理一遍,鉴于之前简单的描述了Tomcat的启动脚本startup.sh,因此打算从启动脚本这里开始循序渐进的整理一下。

 

在“从tomcat的启动脚本学习shell编程”中,了解到当运行startup.sh启动Tomcat时,其经过一系列处理最终通过调用bin目录下的catalina.sh脚本来启动Tomcat。catalina.sh的内容很长,可以简单整理下它做的几件事:

<1>设置基础环境变量(CATAL[......]

Read more

Posted in J2EE | Leave a comment

Java那点事——类加载器结构

在Java语言中,类型的加载和连接过程都是在程序运行期间完成的,尽管这样会带来一定的开销,但是却能为Java应用程序提供高度的灵活性,Java的动态扩展属性正是依赖运行期动态加载和动态连接这个特点实现的。

Java中类的整个生命周期为:加载->验证->准备->解析->初始化->使用->卸载。类加载器便是作用于”加载”阶段,它完成的功能为:通过一个类的全限定名来获取描述此类的二进制字节流“,Java将这个动作放到Java虚拟机外部去实现,允许应用程序自己决[......]

Read more

Posted in Java | Leave a comment