Tomcat的內存、startup.bat詳解、Catalina.bat解析


=======================================內存====================================================

如果你的項目中使用了過多的jar包,可能會導致Java方法區內存溢出。

在%CATALINA_HOME%\bin\catalina.bat文件中添加如下內容:set JAVA_OPTS=-Xms128m -Xmx256m

rem ----- Execute The Requested Command ---------------------------------------
set JAVA_OPTS=-Xms128m -Xmx256m

echo Using CATALINA_BASE: "%CATALINA_BASE%"
echo Using CATALINA_HOME: "%CATALINA_HOME%"
echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"

=====================================================startup.bat詳解====================================================================

if "%OS%" == "Windows_NT" setlocal //判斷當前系統是否是window系統

rem --------------------------------------------------------------------------- //rem 是注釋(下同)

rem Start script for the CATALINA Server

rem

rem $Id: startup.bat 302918 2004-05-27 18:25:11Z yoavs $

rem ---------------------------------------------------------------------------

rem Guess CATALINA_HOME if not defined

set CURRENT_DIR=%cd% //設置當前目錄

if not "%CATALINA_HOME%" == "" gotogotHome //如果設置了CATALINA_HOME環境變量 ,就直接到下面的gotHome處

set CATALINA_HOME=%CURRENT_DIR% //如果沒有設置CATALINA_HOME,就設置CATALINA_HOME為當前目錄(其實這里她假設你進入tomcat的安裝目錄)

if exist "%CATALINA_HOME%\bin\catalina.bat" gotookHome//判斷一下catalina.bat是否找到了,找到了就直接到下面的gotHome處

cd .. //這里他是假設你開始已經進入到了tomcat的bin目錄,所以就退到上一級目錄

set CATALINA_HOME=%cd%//現在再設置CATALINA_HOME為tomcat的安裝目錄

cd %CURRENT_DIR% //這里是進入dos的當前目錄

:gotHome

if exist "%CATALINA_HOME%\bin\catalina.bat" gotookHome //再次判斷catalina.bat是否找到了,找到了就直接到下面的okHome處,沒有的話,就只能提示你啦!

echo The CATALINA_HOME environment variable is not defined correctly

echo This environment variable is needed to run this program

goto end

:okHome

set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat //設置要執行的文件

rem Check that target executable exists

if exist "%EXECUTABLE%" gotookExec //再次判斷catalina.bat是否找到了,找到了就直接到下面的okExec處,沒有的話,就提示。

echo Cannot find %EXECUTABLE%

echo This file is needed to run this program

goto end

:okExec

rem Get remaining unshifted command line arguments and save them in the

set CMD_LINE_ARGS= //這里是設置參數

:setArgs

if ""%1""=="""" gotodoneSetArgs //判斷參數是否加入完成

set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 //將參數組成一行,接在后面

shift

gotosetArgs

:doneSetArgs

call "%EXECUTABLE%" start %CMD_LINE_ARGS% //執行catalina.bat,最好將這行改為:echo "%EXECUTABLE%" start %CMD_LINE_ARGS% 以便閱讀、理解本文件的作用

:end

======================================Catalina.bat腳本解析==============================================================================

 

Catalina.bat是tomcat所有腳本中最重要的腳本,完成幾乎所有的tomcat操作。如啟動,關閉等等,都是由catalina.bat腳本來完成的。接下來,我將對Tomcat catalina.bat腳本進行分析。 

    首先省去catalina.bat開頭諸多注解,這些注解主要是講解各個變量是干什么的。

rem Guess CATALINA_HOME if not defined  查看是否在tomcat目錄下,與startup.bat里相同,不解釋了。
set CURRENT_DIR=%cd% 
if not "%CATALINA_HOME%" == "" goto gotHome 
set CATALINA_HOME=%CURRENT_DIR% 
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome 
cd .. 
set CATALINA_HOME=%cd% 
cd %CURRENT_DIR% 
:gotHome 
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome 
echo The CATALINA_HOME environment variable is not defined correctly 
echo This environment variable is needed to run this program 
goto end 
:okHome 

rem Get standard environment variables 
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" 如果存在setenv.bat腳本,調用它,我的tomcat 沒有這個腳本 

rem Get standard Java environment variables 
if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath 查看是否存在setclasspath.bat腳本,如果存在,轉到okSetclasspath位置 
echo Cannot find %CATALINA_HOME%\bin\setclasspath.bat 否則輸出下面兩行,並退出 
echo This file is needed to run this program 
goto end 
:okSetclasspath    okSetclasspath位置 

set BASEDIR=%CATALINA_HOME%   設定BASEDIR變量與CATALINA_HOME變量值相同 
call "%CATALINA_HOME%\bin\setclasspath.bat" %1   調用setclasspath.bat腳本並加上參數 
if errorlevel 1 goto end      如果存在錯誤 退出 

rem Add on extra jar files to CLASSPATH   設定JSSE_HOME變量,如果存在加入CLASSPATH,不存在跳過 

if "%JSSE_HOME%" == "" goto noJsse    檢查是否存在JSSE_HOME變量 
set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar 如果有加入到CLASSPATH變量后面 
:noJsse                                   
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar  將bootstrap.jar加入到CLASSPATH里 

if not "%CATALINA_BASE%" == "" goto gotBase  如果CATALINA_BASE變量不為空,跳過,轉到gotBase位置 
set CATALINA_BASE=%CATALINA_HOME%  如果為空,將CATALINA_BASE設為CATALINA_HOME變量的值 
:gotBase 

if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir   CATALINA_TMPDIR不為空,跳過,轉到gotTmpdir位置 
set CATALINA_TMPDIR=%CATALINA_BASE%\temp   如果為空,將 CATALINA_TMPDIR設為%CATALINA_BASE%\temp變量的值(即tomcat\temp) 
:gotTmpdir 

if not exist "%CATALINA_HOME%\bin\tomcat-juli.jar" goto noJuli  如果不存在tomcat-juli.jar這個類,轉到noJuli位置 
set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager - Djava.util.logging.config.file="%CATALINA_BASE%\conf \logging.properties"  如果存在,將變量加入到JAVA_OPTS里 
:noJuli 


set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -Dfile .encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config  設定JAVA_OPTS變量 

echo Using CATALINA_BASE:   %CATALINA_BASE%     輸出CATALINA_BASE變量值 
echo Using CATALINA_HOME:   %CATALINA_HOME%     輸出CATALINA_HOME變量值 
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR% 輸出CATALINA_TMPDIR變量值 
if ""%1"" == ""debug"" goto use_jdk        如果變量%1里存在debug ,轉到use_jdk位置 
echo Using JRE_HOME:        %JRE_HOME%     輸出JRE_HOME變量值 
goto java_dir_displayed      轉到java_dir_displayed 
:use_jdk 
echo Using JAVA_HOME:       %JAVA_HOME%    輸出JAVA_HOME變量值 
:java_dir_displayed 
                        下面幾行設定相應變量 
set _EXECJAVA=%_RUNJAVA%        
set MAINCLASS=org.apache.catalina.startup.Bootstrap 
set ACTION=start 
set SECURITY_POLICY_FILE= 
set DEBUG_OPTS= 
set JPDA= 

if not ""%1"" == ""jpda"" goto noJpda 
set JPDA=jpda 
if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport 
set JPDA_TRANSPORT=dt_shmem 
:gotJpdaTransport 
if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress 
set JPDA_ADDRESS=jdbconn 
:gotJpdaAddress 
if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend 
set JPDA_SUSPEND=n 
:gotJpdaSuspend 
if not "%JPDA_OPTS%" == "" goto gotJpdaOpts 
set JPDA_OPTS=-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
:gotJpdaOpts 
shift 
:noJpda 

if ""%1"" == ""debug"" goto doDebug    如果%1為debug,轉到doDebug,運行debug模式 
if ""%1"" == ""run"" goto doRun        如果%1為run,轉到doRun,運行正常模式 
if ""%1"" == ""start"" goto doStart    如果%1為start,轉到doStart,啟動tomcat 
if ""%1"" == ""stop"" goto doStop      如果%1為stop,轉到doStop,關閉tocmat 
if ""%1"" == ""version"" goto doVersion 如果%1為version,轉到doVersion,顯示tomcat的版本號 

echo Usage:  catalina ( commands ... ) 如果%1沒有上述內容,輸出下面幾行,並結束 
echo commands: 
echo   debug             Start Catalina in a debugger 
echo   debug -security   Debug Catalina with a security manager 
echo   jpda start        Start Catalina under JPDA debugger 
echo   run               Start Catalina in the current window 

echo   run -security     Start in the current window with security manager 
echo   start             Start Catalina in a separate window 
echo   start -security   Start in a separate window with security manager 
echo   stop              Stop Catalina 
echo   version           What version of tomcat are you running? 
goto end 

:doDebug 
shift                    將%2里的值轉到%1 
set _EXECJAVA=%_RUNJDB%  將變量 _EXECJAVA設為_RUNJDB變量的值 
set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\jakarta-tomcat-catalina\catalina\src\share"  
設定DEBUG_OPTS變量 

if not ""%1"" == ""-security"" goto execCmd    
如果%1不為-security,轉到execCmd位置 

shift       將%2里的值轉到%1 
echo Using Security Manager       輸出該行 
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy 
設定SECURITY_POLICY_FILE變量的值 

goto execCmd     轉到execCmd位置 

:doRun 
shift        將%2里的值轉到%1 
if not ""%1"" == ""-security"" goto execCmd   如果%1不為-security,轉到execCmd位置 
shift        將%2里的值轉到%1 
echo Using Security Manager   輸出該行 
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy 
設定SECURITY_POLICY_FILE變量的值 

goto execCmd  轉到execCmd位置 

:doStart 
shift        將%2里的值轉到%1 
if not "%OS%" == "Windows_NT" goto noTitle  如果OS變量不為Windows_NT,轉到noTitle 
set _EXECJAVA=start "Tomcat" %_RUNJAVA%       設定_EXECJAVA變量的值 
goto gotTitle      轉到gotTitle位置 
:noTitle 
set _EXECJAVA=start %_RUNJAVA%    設定 _EXECJAVA 變量的值 
:gotTitle               
if not ""%1"" == ""-security"" goto execCmd   如果%1不為-security,轉到execCmd位置 
shift                    將%2里的值轉到%1 
echo Using Security Manager        輸出該行 
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy   
設定SECURITY_POLICY_FILE變量的值 

goto execCmd       轉到execCmd位置 

:doStop 
shift                 將%2里的值轉到%1 
set ACTION=stop       將ACTION的變量設為stop 
set CATALINA_OPTS=    設CATALINA_OPTS為空 

goto execCmd          轉到execCmd位置 

:doVersion            顯示tomcat版本號 
%_EXECJAVA% -classpath "%CATALINA_HOME%\server\lib\catalina.jar" org.apache.catalina.util.ServerInfo   執行該命令 
goto end              結束該程序 

:execCmd           
rem Get remaining unshifted command line arguments and save them in the 
以下幾行將命令參數存入CMD_LINE_ARGS變量中 

set CMD_LINE_ARGS= 
:setArgs 
if ""%1""=="""" goto doneSetArgs 
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 
shift 
goto setArgs 
:doneSetArgs 

rem Execute Java with the applicable properties 
if not "%JPDA%" == "" goto doJpda        如果JPDA變量不為空,轉到doJpda位置 
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity 
如果SECURITY_POLICY_FILE變量不為空,轉到doSecurity位置 

如果都沒有執行下面命令,並結束該程序 
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 
goto end 
:doSecurity        執行下面命令,並結束該程序 
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 
goto end 
:doJpda   
如果SECURITY_POLICY_FILE變量不為空,轉到doSecurityJpda位置,為空執行下面命令,並結束該程序   

if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda 
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 
goto end 
:doSecurityJpda  執行下面命令,並結束該程序 
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 
goto end 

:end 

終結: 

   catalina.bat咋一看還以為是什么windows程序,可以雙擊運行,實際上就是調用java命令運行Bootstrap類。從上面代碼可以看 出tomcat確實是一個純java的程序,腳本最后都變成直接使用java命令執行程序,與我們普通寫的java程序,沒有什么不同。只不過由於 tomcat可以使用各種眾多的模式(如debug,Security等),以及各種需要各種參數所以不得不使用腳本來執行。 

如果你想看看你到底使用了什么命令可以在“if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity”這行下面添加兩行。 
       echo  %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dir ....(下面那段,是一行但太長,折行了) 
       pause 
   第一行的命令是打印這具話,系統會將% %里面的變量提換成找到的值並輸出。第二行是暫停程序,你可以通過任意鍵來恢復運行。 
   下面是我的程序打印的結果: 

start "Tomcat" "C:\Program Files\Java\jdk1.6.0_01\bin\java"  -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="C:\work\tomcat\conf\logging.properties" -Xms128m -Xmx512m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=C:\work\tomcat/conf/jaas.config   -Djava.endorsed.dirs="C:\work\tomcat\common\endorsed" -classpath "C:\Program Files\Java\jdk1.6.0_01\lib\tools.jar;C:\work\tomcat\bin\bootstrap.jar" -Dcatalina.base="C:\work\tomcat" -Dcatalina.home="C:\work\tomcat" -Djava.io.tmpdir="C:\work\tomcat\temp" org.apache.catalina.startup.Bootstrap  start 

    start "tomcat"是另開一個窗口,窗口名是tomcat的意思,你可以去掉這部分,完將你程序打印的拷貝到命令行下,點回車,看是不是一樣運行 tomcat了。Catalina.bat startup實際時就將各種系統變量加以總結,輸出成這個命令。   呵呵!

 

 

 

=========================================================================

在安裝版的Tomcat中沒有catalina.bat,實際上這些catalina.bat的設置都是對注冊表的修改,對應的注冊表鍵值如下

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat6\Parameters\Java\Options

=========================================================================

在使用MyEclipse+Tomcat發布項目的時候通常會給如下提示信息:[org.apache.catalina.core.AprLifecycleListener]-[INFO] The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: (...你的系統環境PATH路徑...)

在停止時發現出現如下信息 
[org.apache.catalina.core.AprLifecycleListener]-[INFO] Failed shutdown of Apache Portable Runtime

解決:Windows下的安裝配置與使用 
1、先去 http://tomcat.heanet.ie/native/ 下載編譯好的 tcnative-1.dll 文件,也可以下載tomcat-native.zip自己進行編譯 
2、修改一下 catalina.bat,加上 
  set CATALINA_OPTS="-Djava.library.path=../../APR/lib" 
因為我把這個DLL放在與Tomcat目錄同級的APR/lib目錄下,所以采用了相對路徑。或者把dll加到你的系統變量PATH里之類的,最簡單的方法應當就是把tcnative-1.dll文件放在Tomcat的bin目錄下:) 

這樣設置后,啟動可以看到信息如下: 
[org.apache.coyote.http11.Http11AprProtocol]-[INFO] Initializing Coyote HTTP/1.1 on http-9091 
在停止時發現出現如下信息 
[org.apache.coyote.http11.Http11AprProtocol]-[INFO] Pausing Coyote HTTP/1.1 on http-9091 
...... 
[org.apache.coyote.http11.Http11AprProtocol]-[INFO] Stopping Coyote HTTP/1.1 on http-9091 

這樣就配置成功了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM