posts - 35,  comments - 7,  trackbacks - 0

          創建一個密鑰文件,
          %JAVA_HOME%/bin/keytool -genkey -alias myalias   -keyalg RSA  -validity 3650 -keystore ./mykeystorefilename

          修改conf/server.xml,打開Tomcat的HTTPS端口,
              <Connector port="8443"
                         maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                         enableLookups="false" disableUploadTimeout="true"
                         acceptCount="100" debug="0" scheme="https" secure="true"
                         keystoreFile="mykeystorefilepath" 
                         keystorePass="mykeystorepassword" >
                <Factory clientAuth="false" protocol="TLS" />
              </Connector>
             
          在應用中修改web.xml,增加授權區
          <security-constraint>
                  <web-resource-collection>
                          <url-pattern>/*</url-pattern>
                          <http-method>GET</http-method>
                          <http-method>POST</http-method>
                  </web-resource-collection>
                  <user-data-constraint>
                          <transport-guarantee>CONFIDENTIAL</transport-guarantee>
                  </user-data-constraint>
          </security-constraint>

          posted @ 2006-01-21 21:32 java小記 閱讀(167) | 評論 (0)編輯 收藏


          指定網絡名稱不可用
          The specified network name is no longer available. : winnt_accept: Asynchronous AcceptEx failed.

          An operation was attempted on something that is not a socket.:winnt_accept: AcceptEx failed. Attempting to recover.

          出現這樣的問題,解決方法是:禁止使用AcceptEx,方法為在httpd.conf文件中增加Win32DisableAcceptEx標記,例如:
                 <IfModule mpm_winnt.c>
                 ..........
                       Win32DisableAcceptEx
                 .........
                 </IfModule>
          雖然這樣會使性能降低一些.
          from apache docs2.0:
          AcceptEx() is a Microsoft WinSock v2 API that provides some performance improvements over the use of
          the BSD style accept() API in certain circumstances. Some popular Windows products, typically virus
          scanning or virtual private network packages, have bugs that interfere with the proper operation of
          AcceptEx(). If you encounter an error condition like:
          [error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx
          failed. Attempting to recover.
          you should use this directive to disable the use of AcceptEx().

          posted @ 2006-01-21 21:07 java小記 閱讀(365) | 評論 (0)編輯 收藏

          在tomcat配置文件server.xml的<Connector ... />配置中,有和連接數相關的參數:
           <Connector
          port="8080"               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                         enableLookups="false" redirectPort="8443" acceptCount="100"
                         debug="0" connectionTimeout="20000"
                         disableUploadTimeout="true" />

          web server允許的最大連接數還受制于操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。

          posted @ 2006-01-05 13:29 java小記 閱讀(643) | 評論 (0)編輯 收藏
          在tomcat_home /conf/web.xml中,把listings參數設置成false即可
          <servlet>
          ...
          <init-param>
          <param-name>listings</param-name>
          <param-value>false</param-value>
          </init-param>
          ...
          </servlet>
          posted @ 2006-01-05 13:21 java小記 閱讀(165) | 評論 (0)編輯 收藏

          下面的這兩個文件,尺寸差別很大.
          %JAVA_HOME%/jre/bin/client/jvm.dll
          %JAVA_HOME%/jre/bin/server/jvm.dll
          Jvm動態庫有client和server兩個版本,分別針對桌面應用和服務器應用做了相應的優化,
          client版本加載速度較快,server版本加載速度較慢但運行起來較快。

          讓Tomcat 使用Server版本的jvm吧,在開始菜單 tomcat5 ->tomcat config的java屬性中有一項 jvm路徑指向server目錄下的jvm就行了。

          更改默認java.exe調用的jvm.dll,這個由jvm.cfg決定。
          編輯%JAVA_HOME%\jre\lib\i386\jvm.cfg 
          里面第一行寫的是 -client 默認就是client版本 ,把第二行的-server KNOWN 放到第一行, 如下面所示
          -server KNOWN
          -client KNOWN
          -hotspot ALIASED_TO -client
          -classic WARN
          -native ERROR
          -green ERROR
          改完保存,然后看看默認版本:
          C:\java -version
          java version "1.4.2_07"
          Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_07-b05)
          Java HotSpot(TM) Server VM (build 1.4.2_07-b05, mixed mode)
          看到有 Server VM 字樣

          posted @ 2006-01-05 13:09 java小記 閱讀(246) | 評論 (0)編輯 收藏


          內存不足 (OOM) - 由于 java 堆或本地內存中的內存耗盡,應用程序顯示“內存不足”錯誤。
          內存泄漏 - java 堆或本地內存的持續內存增長,最終將導致內存不足狀態。調試內存泄漏狀態的技術與調試內存不足狀態的技術相同。

          Java 堆 - 這是 JVM 用來分配 java 對象的內存。java 堆內存的最大值用 java 命令行中的 -Xmx 標志來指定。
          如果未指定最大的堆大小,那么該極限值由 JVM 根據諸如計算機中的物理內存量和該時刻的可用空閑內存量這類
          因素來決定。始終建議您指定最大的 java 堆值。

          本地內存 - 這是 JVM 用于其內部操作的內存。JVM 將使用的本地內存堆數量取決于生成的代碼量、創建的線程、
          GC 期間用于保存 java 對象信息的內存,以及在代碼生成、優化等過程中使用的臨時空間。
          如果有一個第三方本地模塊,那么它也可能使用本地內存。例如,本地 JDBC 驅動程序將分配本地內存。
          最大本地內存量受到任何特定操作系統上的虛擬進程大小限制的約束,也受到用 -Xmx 標志指定用于 java 堆的內存量的限制。
          例如,如果應用程序能分配總計為 3 GB 的內存量,并且最大 java 堆的大小為 1 GB,那么本地內存量的最大值可能在 2 GB 左右。
           
          進程大小 - 進程大小將是 java 堆、本地內存與加載的可執行文件和庫所占用內存的總和。在 32 位操作系統上,進程的虛擬地址
          空間最大可達到 4 GB。從這 4 GB 內存中,操作系統內核為自己保留一部分內存(通常為 1 - 2 GB)。剩余內存可用于應用程序。

          Windows缺省情況下,2 GB 可用于應用程序,剩余 2 GB 保留供內核使用。但是,在 Windows 的一些變化版本中,有一個 /3GB 開關
          可用于改變該分配比率,使應用程序能夠獲得 3 GB。有關 /3GB 開關的詳細信息,可以在以下網址中找到:
          http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ddtools/hh/ddtools/bootini_1fcj.asp
          RH Linux AS 2.1 - 3 GB 可用于應用程序。

          進程地址空間和物理內存之間的差異:
          每個進程都獲得其自有的地址空間。在 32 位操作系統中,此地址空間范圍為 0 到 4 GB。此范圍與計算機的可用隨機存取內存 (RAM)
          或交換空間無關。計算機中的可用物理內存總量是該計算機上的可用 RAM 和交換空間之和。所有運行的進程共享這些物理內存。

          進程內的存儲地址是虛擬地址。內核將此虛擬地址映射到物理地址上。物理地址指向物理內存中的某個位置。在任一給定時間,計算機
          中運行進程所使用的全部虛擬內存的總和不能超過該計算機上可用物理內存的總量。


          為什么會發生 OOM 問題,JVM 在這種情況下如何處理?

          如果 JVM 不能在 java 堆中獲得更多內存來分配更多 java 對象,將會拋出 java 內存不足 (java OOM) 錯誤。如果 java 堆充滿了活
          動對象,并且 JVM 無法再擴展 java 堆,那么它將不能分配更多 java 對象。
          在這種情況下,JVM 讓應用程序決定在拋出 java.lang.OutOfMemoryError 后該執行什么操作。例如,應用程序可以處理此錯誤,并決定
          以安全方式自行關閉或決定忽略此錯誤。如果應用程序不處理此錯誤,那么拋出此錯誤的線程將退出(如果您進行 java Thread Dump,那
          么將看不到該線程)。

          在使用 Weblogic Server 的情況下,如果此錯誤是由某個執行線程拋出的,則會處理此錯誤并將其記錄在日志中。如果連續拋出此錯誤,
          那么核心運行狀況監視器線程將關閉 Weblogic Server。

          如果 JVM 無法獲得更多本地內存,它將拋出本地內存不足(本地 OOM)錯誤。當進程到達操作系統的進程大小限值,或者當計算機用完
          RAM 和交換空間時,通常會發生這種情況。當發生這種情況時,JVM 處理本地 OOM 狀態,記錄說明它已用完本地內存或無法獲得內存的
          消息,然后退出。如果 JVM 或加載的任何其它模塊(如 libc 或第三方模塊)不處理這個本地 OOM 狀態,那么操作系統將給 JVM 發送
          命令 JVM 退出的 sigabort 信號。通常情況下,JVM 收到 sigabort 信號時將會生成一個核心文件。


          排除故障的步驟:
          確定是 Java OOM 還是本地 OOM:
          如果 stdout/stderr 消息說明這是一個 java.lang.OutOfMemoryError,那么這就是 Java OOM
          如果 stdout/stderr 消息說明無法獲得內存,那么這就是本地 OOM
          請注意,上述消息僅發送到 stdout 或 stderr 中,而不發送到應用程序特定的日志文件(如 weblogic.log)


          對于 Java OOM,收集和分析 verbose:gc 輸出 在 java 命令行中添加“-verbose:gc”標志。這樣將會把 GC 活動信息打印到
          stdout/stderr。將 stdout/stderr 重定向到一個文件。運行應用程序,直到該問題重現。 確保 JVM 在拋出 java OOM 之
          前完成下列任務,執行一次完整 GC 運行,并且刪除了所有不可及對象以及虛可及、弱可及、軟可及對象,并回收了那些空間。
          有關不同級別的對象可及性的詳細信息,可以在以下網址中可找到:
          http://java.sun.com/developer/technicalArticles/ALT/RefObj
          您可以檢查是否在發出 OOM 消息之前執行了完整 GC 運行。當完成一次完整 GC 運行時,將會打印類似如下消息(格式取決
          于 JVM - 請查看 JVM 幫助信息以了解有關格式)
          [memory ] 7.160: GC 131072K->130052K (131072K) in 1057.359 ms
          以上輸出的格式如下(備注:在此模式下將全部使用相同的格式):
          [memory ] <start>: GC <before>K-><after>K (<heap>K), <total> ms
          [memory ] <start> - start time of collection (seconds since jvm start)
          [memory ] <before> - memory used by objects before collection (KB)
          [memory ] <after> - memory used by objects after collection (KB)
          [memory ] <heap> - size of heap after collection (KB)
          [memory ] <total> - total time of collection (milliseconds)

          但是,沒有辦法斷定是否使用 verbose 消息刪除了軟/弱/虛可及的對象。如果您懷疑在拋出 OOM 時這些對象仍然存在,請
          與 JVM 供應商聯系。

          如果垃圾回收算法是一種按代回收算法(對于 Jrockit 為 gencopy 或 gencon,對于其它 JDK 則是缺省算法),您也將看
          到類似如下的 verbose 輸出:
          [memory ] 2.414: Nursery GC 31000K->20760K (75776K), 0.469 ms
          以上是 nursery GC(即 young GC)周期,它將把活動對象從 nursery(或 young 空間)提升到 old 空間。這個周期對我
          們的分析不重要。有關按代回收算法的詳細信息,可以在 JVM 文檔中找到。
          如果在 java OOM 之前未發生 GC 周期,那么這是一個 JVM 錯誤。

          完全壓縮:
          確保 JVM 執行了適當的壓縮工作,并且內存并未成碎片(否則會阻止分配大對象并觸發 java OOM 錯誤)。
          Java 對象要求內存是連續的。如果可用空閑內存是一些碎片,那么 JVM 將無法分配大對象,因為它可能無法放入任何可用
          空閑內存塊中。在這種情況下,JVM 將執行一次完全壓縮,以便形成更多連續的空閑內存來容納大對象。
          壓縮工作包括在 java 堆內存中將對象從一個位置移動到另一個位置,以及更新對這些對象的引用以指向新位置。除非確有
          必要,否則 JVM 不會壓縮所有對象。這是為了減少 GC 周期的暫停時間。
          我們可以通過分析 verbose gc 消息來檢查 java OOM 是否由碎片引起。如果您看到類似如下的輸出(在此無論是否有可用
          的空閑 java 堆都會拋出 OOM),那么這就是由碎片引起的。

          [memory ] 8.162: GC 73043K->72989K (131072K) in 12.938 ms
          [memory ] 8.172: GC 72989K->72905K (131072K) in 12.000 ms
          [memory ] 8.182: GC 72905K->72580K (131072K) in 13.509 ms
          java.lang.OutOfMemoryError
          在上述情況中您可以看到,所指定的最大堆內存是 128MB,并且當實際內存使用量僅為 72580K 時,JVM 拋出 OOM。堆使用量
          僅為 55%。因此在這種情況下,碎片影響是:即使還有 45% 的空閑堆,內存也會拋出 OOM。這是一個 JVM 錯誤或缺陷。您應
          當與 JVM 供應商聯系。

          如果 JVM 一切都正常(上一步中提到的所有操作),那么此 java OOM 可能是應用程序的問題。應用程序可能在不斷泄漏一些
          java 內存,而這可能導致出現上述問題?;蛘?,應用程序使用更多的活動對象,因此它需要更多 java 堆內存。在應用程序中
          可以檢查以下方面: 應用程序中的緩存功能 - 如果應用程序在內存中緩存 java 對象,則應確保此緩存并沒有不斷增大。對
          緩存中的對象數應有一個限值。我們可以嘗試減少此限值,來觀察其是否降低 java 堆使用量。 Java 軟引用也可用于數據緩存,
          當 JVM 用完 java 堆時,可以保證刪除軟可及對象。

          長期活動對象 - 如果應用程序中有長期活動對象,則可以嘗試盡可能減少這些對象的存在期。例如,調整 HTTP 會話超時值將
          有助于更快地回收空閑會話對象。
          內存泄漏 - 內存泄漏的一個例子是在應用服務器中使用數據庫連接池。當使用連接池時,必須在 finally 塊中顯式關閉 JDBC
          語句和結果集對象。這是因為,當從池中調用連接對象上的 close() 時,只是簡單地把連接返回池中以供重用,并沒有實際關閉
          連接和關聯的語句/結果集對象。

          增加 java 堆 - 如果可能的話,我們也可嘗試增加 java 堆,以觀察是否能解決問題。

          如果上述建議都不適用于該應用程序,那么,我們需要使用一個基于 JVMPI(JVM 事件探查器接口)的事件探查器(如 Jprobe 或
          OptimizeIt)來找出哪些對象正在占用 java 堆。事件探查器還提供 java 代碼中正在創建這些對象的位置的詳細信息。本文檔并
          不介紹每個事件探查器的詳細信息??梢詤⒖际录讲槠魑臋n來了解如何用事件探查器設置和啟動應用程序。一般而言,基于 JVMPI
           的事件探查器需要較高的系統開銷,并會大大降低應用程序的性能。因此,在生產環境中使用這些事件探查器并不可取。
          http://www.borland.com/optimizeit
          http://www.quest.com/jprobe

          對于本地 OOM 問題:
          收集下列信息: .verbosegc 輸出,通過它可監視 java 堆使用量。這樣將有助于了解此應用程序的 java 內存要求。
          應當注意,指定的最大堆內存量(在 java 命令行中使用 Xmx 標志)與應用程序的實際 java 堆使用量無關,其在 JVM 啟動時被保留,
          并且此保留內存不能用于其它任何用途。

          在使用 Jrockit 時,使用 -verbose 來代替 -verbosegc,因為這可以提供 codegen 信息以及 GC 信息。
          定期記錄進程虛擬內存大小,從啟動應用程序時起直到 JVM 用完本地內存。這樣將有助于了解此進程是否確實達到該操作系統的大小限
          值。在 Windows 環境下,使用下列步驟來監視虛擬進程大小:
          在“開始” -> “運行”對話框中,輸入“perfmon”并單擊“確定”。
          在彈出的“性能”窗口中,單擊“+”按鈕(圖表上部)。
          在顯示的對話框中選擇下列選項:
          性能對象:進程(不是缺省的處理器)
          從列表中選擇計數器:虛擬字節數
          從列表中選擇實例:選擇 JVM (java) 實例
          單擊“添加”,然后單擊“關閉”
          在 Unix 或 Linux 環境下,對于一個給定 PID,可以使用以下命令來查找虛擬內存大小 - ps -p <PID> -o vsz。

          在 Linux 環境下,單個 JVM 實例內的每個 java 線程都顯示為一個獨立的進程。如果我們獲得根 java 進程的 PID,那么這就足夠了。
          可以使用 ps 命令的 .forest 選項來找到根 java 進程。例如,ps lU <user> --forest 將提供一個由指定用戶啟動的所有進程的 ASCII
          樹圖。您可以從該樹圖中找到根 java。

          計算機中的內存可用性
          如果計算機沒有足夠的 RAM 和交換空間,則操作系統將不能為此進程提供更多內存,這樣也會導致內存不足。請確保 RAM 與磁盤中的交換
          空間之和足以滿足該計算機中正在運行的所有進程的需要。

          調整 java 堆
          如果 java 堆使用量完全在最大堆范圍內,則減小 java 最大堆將為 JVM 提供更多的本地內存。這不是一個解決辦法,而是一個可嘗試的變
          通方法。由于操作系統限制進程大小,我們需要在 java 堆和本地堆之間尋求一個平衡。
          JVM 的本地內存使用量
          在加載了所有類并調用了方法(代碼生成結束)后,JVM 的本地內存用量預計將會幾乎達到穩定。對于大多數應用程序而言,這通常發生在
          最初幾小時內。此后,JVM 可能會因加載運行時類型、生成優化代碼等處理而僅使用少量本地內存。

          為了縮小問題的范圍,可嘗試禁用運行時優化,并檢查這是否會產生任何效果。

          在使用 Jrockit 時,可使用 -Xnoopt 標志來禁用運行時優化。

          在使用 SUN hotspot JVM 時,-Xint 標志將強迫 JVM 在解釋模式中運行(不生成代碼)。
          如果在整個運行過程中,本地內存使用量繼續不斷增加,那么這可能是本地代碼中的內存泄漏。

          第三方本地模塊或應用程序中的 JNI 代碼
          檢查您是否在使用類似數據庫驅動程序的任何第三方本地模塊。這些本地模塊也可以分配本地內存,泄漏可能從這些模塊中發生。為了縮
          小問題的范圍,應嘗試在沒有這些第三方模塊的情況下重現問題。例如,可以使用純 java 驅動程序來代替本地數據庫驅動程序。

          檢查應用程序是否使用一些 JNI 代碼。這也可能造成本地內存泄漏,如果可能的話,您可以嘗試在沒有 JNI 代碼的情況下運行應用程序。

          如果在執行上述步驟后還不能找到本地內存泄漏的根源,那么您需要與 JVM 供應商合作來獲得一個特殊的編譯版本,它可以跟蹤本地內存
          分配調用,并可提供有關泄漏的更多信息。

          Jrockit 特定特性
          Jrockit 81SP1 和更高版本支持 JRA 記錄(Java 運行時間分析器)。這對于收集 JVM 運行時的信息很有用,將提供應用程序的有關信息,
          例如,正在運行的 GC 數、軟/弱/虛引用的數目、熱方法,等等。如果 JVM 出現性能問題或掛起問題,那么用幾分鐘進行記錄和分析數據
          就會很有用。有關詳細信息,可以在 Jrockit 文檔中找到。
          http://e-docs.bea.com/wljrockit/docs142/userguide/jra.html


          如果您已經理解這個模式,但仍需要其它幫助,您可以:
          http://support.bea.com 上查詢 AskBEA(例如使用“out of memory”),以查找其它已發布的解決方案。
          http://support.bea.com 上,向 BEA 的某個新聞組中提出更詳細具體的問題。
          如果這還不能解決您的問題,并且您擁有有效的技術支持合同,您可以通過登錄以下網站來打開支持案例:http://support.bea.com。
           

          posted @ 2005-12-21 21:48 java小記 閱讀(410) | 評論 (0)編輯 收藏

          修改 windows: mysql-root/my.ini  (mysql-4.1.14-win32.zip)
               linux:   /etc/my.cnf
          將其中的default-character-set都改成gbk
          也就是如下兩個SECTION
          [client] 
          。。。。
          default-character-set=gbk
          。。。。


          [mysqld]
          。。。。
          default-character-set=gbk
          。。。。


          Linux上:
          mysql> show variables like "%set%";
          +--------------------------+----------------------------------------------------
          ----------------------+
          | Variable_name            | Value
                                |
          +--------------------------+----------------------------------------------------
          ----------------------+
          | character_set_client     | gbk
                                |
          | character_set_connection | gbk
                                |
          | character_set_database   | gbk
                                |
          | character_set_results    | gbk
                                |
          | character_set_server     | gbk
                                |
          | character_set_system     | utf8
                                |
          | character_sets_dir       | /usr/local/mysql-standard-4.1.12-pc-linux-gnu-i686/
          share/mysql/charsets/ |
          +--------------------------+----------------------------------------------------
          ----------------------+
          7 rows in set (0.00 sec)
          此時可以查看中文的字段,應該一切正常顯示。如果不正常顯示說明數據庫中存放的不是正確編碼。


          Windows上:
          mysql> show variables like "%set%";
          +--------------------------+--------------------------+
          | Variable_name            | Value                    |
          +--------------------------+--------------------------+
          | character_set_client     | latin1                   |
          | character_set_connection | latin1                   |
          | character_set_database   | gbk                      |
          | character_set_results    | latin1                   |
          | character_set_server     | gbk                      |
          | character_set_system     | utf8                     |
          | character_sets_dir       | D:\MySql\share\charsets/ |
          +--------------------------+--------------------------+
          7 rows in set (0.00 sec)

          不知道為什么在windows上my.ini中
          [client]
          。。。。
          default-character-set=gbk
          沒有起作用。

          Windows上登錄mysql,更改會話的編碼為gbk

          mysql> set names "gbk";
          Query OK, 0 rows affected (0.00 sec)

          mysql> show variables like "%set%";
          +--------------------------+--------------------------+
          | Variable_name            | Value                    |
          +--------------------------+--------------------------+
          | character_set_client     | gbk                      |
          | character_set_connection | gbk                      |
          | character_set_database   | gbk                      |
          | character_set_results    | gbk                      |
          | character_set_server     | gbk                      |
          | character_set_system     | utf8                     |
          | character_sets_dir       | D:\MySql\share\charsets/ |
          +--------------------------+--------------------------+
          7 rows in set (0.00 sec)

          此時可以查看中文的字段,應該一切正常顯示。如果不正常顯示說明數據庫中存放的不是正確編碼。


          完全備份MySql
          Linux上:
            mysqldump  --user=myname --password=mypassword  mydb >mydb_backup.sql
          Windows上:
           Linux上:
            mysqldump   --default-character-set=gb2312 --user=myname --password=mypassword  mydb >mydb_backup.sql

          Windows腳本自動登陸
          D:\MySql\bin>mysql  --user=myname  --password=mypassword   --default-character-set=gbk   --host=192.168.0.17

          posted @ 2005-12-20 15:56 java小記 閱讀(552) | 評論 (0)編輯 收藏

          項目中需要對安全問題引起足夠的重視,比如下列tomcat的安全問題容易被忽略:
           
          server.xml默認有下面一行:
          <Server port="8005" shutdown="SHUTDOWN">
          這樣允許任何人只要telnet到服務器的8005端口,輸入"SHUTDOWN",然后回車,服務器立即就被關掉了。
          從安全的角度上考慮,我們需要把這個shutdown指令改成一個別人不容易猜測的字符串。
          例如修改如下:
          <Server port="8006" shutdown="lizongbo">,這樣就只有在telnet到8006,并且輸入"lizongbo"才能夠關閉Tomcat.
          注意:這個修改不影響shutdown.bat的執行。運行shutdown.bat一樣可以關閉服務器。

           

          參考Tomcat安全文檔英文鏈接:http://jakarta.apache.org/tomcat/faq/security.html#8005
          還有兩個問題需要注意:
          1、  對于tomcat3.1中,屏蔽目錄文件自動列出的方法是什么?
          缺省情況下,如果你訪問tomcat下的一個web應用,那么如果你輸入的是一個目錄名,而且該目錄下沒有一個可用的welcome文件,那么tomcat會將該目錄下的所有文件列出來,如果你想屏蔽這個缺省行為,那么可以修改conf/web.xml文件,將其中的:
          <servlet>
          <servlet-name>default</servlet-name>
          <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
          <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
          </init-param>
          <init-param>
          <param-name>listings</param-name>
          <param-value>true</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
          </servlet>
          修改為:
          <servlet>
          <servlet-name>default</servlet-name>
          <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
          <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
          </init-param>
          <init-param>
          <param-name>listings</param-name>
          <param-value>false</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
          </servlet>


          2、 如何讓Tomcat記錄客戶端的訪問日志 
          下面是Tomcat相關手冊中的介紹:
          以下是引用來自 的內容:
          Valve (功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣) className 指定Valve使用的類名,
          如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程序的訪問信息 directory 指定log文件存放
          的位置 pattern 有兩個值,common方式記錄遠程主機名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響
          應代碼,發送的字節數。combined方式比common方式記錄的值更多 

          所以需要完成的步驟:
             1。修改Tomcat的conf/server.xml文件。
             2。加上Valve節點到server.xml文件中,和您目前使用的Connector的節點平級。
                如:<Valve className="org.apache.catalina.valves.AccessLogValve"
                directory="e:\trs\trscds\tomcat\logs" pattern="combined"/>
             3。重新啟動您的Tomcat
             4。有用戶在訪問的時候,在指定的log目錄下面會生成一個access_log文件(每天一個)。
          上述的步驟是以Tomcat4.x為例。(可能會影響性能,不推薦大家使用)。

           

          還有一個問題:需要處理好Tomcat管理臺的安全。
          Tomcat管理臺的應用文件,默認在{Tomcat安裝目錄}\server\webapps下,有admin和manager兩個應用。
          其用戶密碼,在{Tomcat安裝目錄}\conf/tomcat-users.xml中定義。在{Tomcat安裝目錄}\webapps下
          admin.xml和manager.xml文件定義了可以通過訪問/admin和/manager進入。
          默認情況下,完全可以登錄tomcat管理臺,造成嚴重安全問題
          檢測辦法:用IE打開鏈接http://[IP]:[Port]/admin,以用戶名admin,密碼為空登錄,如果成功,
          說明存在問題。
          解決辦法:可以刪除{Tomcat安裝目錄}\webapps下admin.xml和manager.xml文件,或者去掉用戶密
          碼,也可以刪除應用文件。


          我們一個用戶提到如果找不到網頁即出現404錯誤,會顯示服務器版本號,服務器配置也一目了然,
          為了避免這種情況,希望自定義設置錯誤頁面。
          設置如下:
          1、將附件的index.htm文件拷貝至\webapps\ROOT目錄內,刪除或改名原來的index.jsp文件。
          2、用記事本打開\conf\web.xml文件,在文件的倒數第二行(</web-app>一行之前)加入以下內容:
                 <error-page> 
                  <error-code>404</error-code>
                  <location>/index.htm</location> 
                </error-page>


           

          posted @ 2005-12-20 15:54 java小記 閱讀(445) | 評論 (0)編輯 收藏

          默認安裝tomcat5然后在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m 如果用startup.bat啟動tomcat,OK設置生效.夠成功的分配200M內存.

          但是如果不是執行startup.bat啟動tomcat而是利用windows的系統服務啟動tomcat服務,上面的設置就不生效了,就是說set JAVA_OPTS=-Xms128m -Xmx350m 沒起作用.上面分配200M內存就OOM了..

          windows服務執行的是bin\tomcat.exe.他讀取注冊表中的值,而不是catalina.bat的設置.

          解決辦法:
          修改注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
          原值為
          -Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
          -Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
          -Xrs

          加入 -Xms300m -Xmx350m 
          重起tomcat服務,設置生效.

          posted @ 2005-12-20 11:58 java小記 閱讀(3293) | 評論 (0)編輯 收藏


           JVM(java虛擬機)其實就是操作系統(如windows)上的一個普通程序(進程名叫java,這個程序可以解釋執行class文件)。
           當java進程啟動時會首先分配一塊堆內存(最小內存),以后每當class字節碼程序要求JVM(java進程)分配內存時,JVM
           就會在預先分配的那塊內存上面為class字節碼程序分配內存,當預先分配的那塊內存用沒時,JVM會再向操作系統要內存
           (物理內存), 但是JVM不會無限制的向操作系統要內存,當它占用的實際堆內存達到一個預定值(最大可用內存)時,
           如果class字節碼程序還向JVM要內存,并且JVM無法通過回收當前堆中的內存來為class字節碼程序服務時,它就會給程
           序拋出java.lang.OutOfMemoryError。其中內存回收時機并不是再用掉內存達到最大可用內存時才進行,他的運行時機是
           不確定的,可見JVM的最大可用內存就是你的java程序(class字節碼程序)能夠使用的最大內存。
           例如:你把jvm最大可用內存設為200M,而你的物理內存1G.在這種程序下你的class程序最多能使用200M內存,雖然你可能
           還有800M內存可用,但是當你的程序用掉200M后如果再要內存,JVM不會因為你還有800M內存而為你分配內存,他會向你拋
           出java.lang.OutOfMemoryError .
           所以JVM最大可用內存參數比較重要。
           
           一般建議堆的最大值設置為可用內存的最大值的80%。
           
           
           (以下為轉網絡)
           Tomcat默認可以使用的內存為64MB,在較大型的應用項目中,這點內存是不夠的,需要調大。
           Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,
           增加如下設置:
           set JAVA_OPTS=-Xms【初始化內存大小】 -Xmx【可以使用的最大內存】
           需要把這個兩個參數值調大。例如: set JAVA_OPTS=-Xms64m -Xmx256m
           表示初始化內存為256MB,可以使用的最大內存為512MB。
           
           另外需要考慮的是Java提供的垃圾回收機制。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。收集垃圾可
           以接受的速度與應用有關,應該通過分析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那么完全垃圾收集就
           會很慢,但是頻度會降低。如果你把堆的大小和內存的需要一致,完全收集就很快,但是會更加頻繁。調整堆大小的的目
           的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準測試的時候,為保證最好的性能,要把堆
           的大小設大,保證垃圾收集不在整個基準測試的過程中出現。
           如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過 3-5 秒。如果垃圾收集成為瓶頸,那
           么需要指定代的大小,檢查垃圾收集的詳細輸出,研究 垃圾收集參數對性能的影響。一般說來,你應該使用物理內存
           的 80% 作為堆大小。當增加處理器時,記得增加內存,因為分配可以并行進行,而垃圾收集不是并行的。


          -Xms : 應用程序初始化內存大寫,注意是你的某一個應用程序,多個應用程序將生成多個JVM實例
          -Xmx:  應用程序占用內存的最大值,將不能超過這個值,否則可能導致OutOfMemory.
          -XX:NewRatio  old generation/new generation 的比例

          推薦的-Xms -Xmx設置成一樣,,為系統內存的80%.這樣,不用每次GC清理完再重新分配.
          而-XX:NewRatio為2  比如: -Xms384m -Xmx384m -XX:NewRatio=2

          posted @ 2005-12-19 18:42 java小記 閱讀(1891) | 評論 (0)編輯 收藏
          僅列出標題
          共4頁: 上一頁 1 2 3 4 下一頁 

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 临武县| 宁河县| 东乌| 茂名市| 泰和县| 婺源县| 牡丹江市| 凤庆县| 修水县| 长顺县| 富顺县| 大埔区| 浙江省| 九台市| 思茅市| 长武县| 略阳县| 柳江县| 汉寿县| 乐东| 板桥市| 永善县| 犍为县| 仁寿县| 炎陵县| 阿城市| 天镇县| 纳雍县| 太仆寺旗| 晋中市| 德昌县| 馆陶县| 扶风县| 徐水县| 新兴县| 宜君县| 宣武区| 南漳县| 贺州市| 镇远县| 安多县|