从 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虚拟机内存大小优化JVM

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统和对应的JDK的版本(只要是符合Sun发布的Java规范的),但我们...
  • chenleixing
  • chenleixing
  • 2015年03月08日 22:22
  • 2955

提高java代码执行效率

1,尽量不要使用+号来连接字符串,至少不要在隔行中使用+来连接字符串。因为有的java虚拟机可能对字符串连接+做了性能优化,在都同行的+字符串连接,转化为StringBuffer的append()方法...
  • injurooioo
  • injurooioo
  • 2016年02月01日 11:38
  • 1415

tomcat中jvm参数设置

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

关于提高C语言执行效率的几点

1、以空间换取时间程序的复杂度包含时间复杂度和空间复杂度,而随着计算机硬件的发展,渐渐放低了对空间复杂度的要求,在很多情况下,为了换取程序的执行效率,牺牲计算机的空间。比如字符串的相关操作、使用缓存技...
  • tlzhatao
  • tlzhatao
  • 2015年05月03日 13:00
  • 831

tomcat与jvm的关系分析

首先,我们来看几个概念: 1.什么是jvm 我们从操作系统的层面来理解,jvm其实就是操作系统中的一个进程。既然是一个进程,那么我们很容易的可以通过任务管理器来查看。假设此时我们启动myeclip...
  • u010653908
  • u010653908
  • 2016年11月30日 10:50
  • 5037

Tomcat 启动 设置JVM参数& 使用指定的配置文件启动

1、设置虚拟机参数 若需要设置TOMCAT JAVA虚拟机的参数,可在环境变量中设置CATALINA_OPTS或JAVA_OPTS: export CATALINA_OPTS="-Xms128m -...
  • hongweigg
  • hongweigg
  • 2016年11月24日 10:13
  • 3603

Linux起动时Tomcat找不到JAVA虚拟机的问题

       最近在SlackWare下进行JAVA的学习。每次都要手工起动Tomcat,很不方便。于是照猫画虎写了一个脚本开机时自动运行Tomcat。       使用JDK1.5.6,安装在/ap...
  • deng2001
  • deng2001
  • 2006年04月17日 16:49
  • 3550

正确认识java JVM与c的执行效率

认为Java不能写JVM是完全错误的。JNode是一个用Java写的开源操作系统,他里面的JVM就是用Java写的。这个操作系统现在有几十兆,其中   99%的代码是用java编写,其中只有一个极小的...
  • huxin1
  • huxin1
  • 2008年09月30日 16:33
  • 2636

tomcat 与 jvm关系

现象: 一个tomcat可以有多个web应用,当它启动时,会启动一个jvm进程。多个tomcat,会启动多个jvm进程。 原因: Tomcat是一个JSP/Servlet容器。其作...
  • qq_24409555
  • qq_24409555
  • 2017年07月27日 12:16
  • 173

提高SQL执行效率的方法有哪些?

2、JAVA中的存储过程?     3、解释select * from dual的执行计划?     4、提高SQL执行效率的方法有哪些?...
  • zhan3107006604
  • zhan3107006604
  • 2014年05月31日 19:14
  • 1944
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从 Java 虚拟机(JVM)层提高 Tomcat 执行效率
举报原因:
原因补充:

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