从 Java 虚拟机(JVM)层提高 Tomcat 执行效率

原创 2012年03月29日 20:04:20

Sun 提供的 爪哇虚拟机(JVM)提供了运行时参数“-client”和“-server”。前者 -client 有很快的启动速度,同时内存和线程管理方式利于图形界面控件的调度。后边的 -server 的内存和线程管理方式对于运行JavaEE 的相关类库以及类似模式的程序支持很强大。同时,-client 比 -server 能有更快的加载速度,经过各种环境实地测试,-client 启动时间能够在 -server 的 50% 以下,也就是启动快了一倍以上。可能就是因此,Tomcat 给出的执行脚本,没有提供方便的途径调整此参数。所有程序都是用 -client 方式启动爪哇虚拟机的。


  我们使用 Tomcat 自然是要运行服务器程序。所以经过解读 Tomcat 执行脚本,我在此提供改造方式,使 Tomcat 能够基于 -server 方式的爪哇虚拟机启动。我用 Tomcat7.0.22 的执行脚本为例介绍改造方式。

下面是 catalina.sh 中的一段。大家可以通过查找 tomcat-juli.jar 来定位到这段代码的位置。对于 Tomcat7.0.22 来说,本段代码开始于 195 行。

# Add tomcat-juli.jar to classpath
# tomcat-juli.jar can be over-ridden per instance
if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
  CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar
else
  CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar
fi

# Added by Shane Loo Li at 2012-3-29 Thursday. Use server java virtual machine to run Tomcat
JAVA_OPTS=$JAVA_OPTS" -server"

# Bugzilla 37848: When no TTY is available, don't output to console
have_tty=0
if [ "`tty`" != "not a tty" ]; then
    have_tty=1
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
  JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
  JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
  CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
  CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"`
  CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"`
  CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
  JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
fi

我是 Shane Loo Li ,其中我增加的那行内容“ JAVA_OPTS=$JAVA_OPTS" -server" ”,就是用来以 -server 方式启动爪哇虚拟机的修改。JAVA_OPTS 是此执行脚本为运行爪哇虚拟机准备的参数变量。最终会追加在启动 Tomcat 的命令后边。添加的位置不宜大幅度调整。从逻辑上来说,这段代码上边是逐一调整各种运行命令行参数。再往下就是执行过程控制的代码了。


对于 catalina.bat (Windows使用),含义与上边一样。不过 Windows 的 cmd壳语法与 bash 不同,修改位置也只是大概一致。对于 Tomcat7.0.22 ,此段代码开始于 168 行。

rem Add tomcat-juli.jar to classpath
rem tomcat-juli.jar can be over-ridden per instance
if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
goto juliClasspathDone
:juliClasspathHome
set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
:juliClasspathDone

rem Added by Shane Loo Li at 2012-1-16 Monday. Use server java virtual machine to run Tomcat
set JAVA_OPTS=%JAVA_OPTS% -server

if not "%LOGGING_CONFIG%" == "" goto noJuliConfig
set LOGGING_CONFIG=-Dnop
if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
:noJuliConfig
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%
rem 是 cmd壳语法中的注释关键字,相当于bash里边的“#”,C系列里边的“//”,Oracle里边的“--”。


通过这样的修改,再次通过执行脚本“startup.sh”或“startup.bat”启动 Tomcat 的时候,就能够以 -server 方式启动爪哇虚拟机了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

tomcat中jvm参数设置

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识...

从 Java 虚拟机(JVM)层提高 Tomcat 执行效率

Sun 提供的 爪哇虚拟机(JVM)提供了运行时参数“-client”和“-server”。前者 -client 有很快的启动速度,同时内存和线程管理方式利于图形界面控件的调度。后边的 -server...

Java虚拟机JVM内存分区及代码执行机制

Java虚拟机JVM内存分区及代码执行机制 [日期:2011-05-26] 来源:Linux社区  作者:zhangren07 1.  JVM体系结构...

Java虚拟机JVM内存分区及代码执行机制

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操...

Java虚拟机JVM内存分区及代码执行机制

1.  JVM体系结构图1 JVM体系结构   方法区:存放JVM加载的类型信息。包括: 类型基本信息,常量池,字段信息,方法信息,类变量,指向ClassLoader的引用,Class类的引用,方法表...

Java虚拟机JVM内存分区及代码执行机制

1.  JVM体系结构   图1 JVM体系结构        方法区:存放JVM加载的类型信息。包括: 类型基本信息,常量池,字段信息,方法信息,类变量,指向ClassLoader的引用,Clas...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)