The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          #

          mvn archetype:generate -DgroupId=com.bestpay.support.gd -DartifactId=JBatchReward -DarchetypeArtifactId=maven-archetype-j2ee-simple
          posted @ 2015-06-10 12:31 Eric_jiang 閱讀(175) | 評論 (0)編輯 收藏

          看maven-definitive-guide到第五章了,發現maven可以創建不少類型的demo,只要輸入:
          mvn archetype:create就可以
          不過,創建的同時需要archetypeArtifactId這個參數來識別,不過不太清楚有什么類型,只知道默認不填是maven-archetype-quickstart ,web是maven-archetype-webapp
          發現有更簡單的方法,只要輸入mvn archetype:generate
          就會將所有可用的類型顯示,并且讓你自己選,輸出如下:
          1: internal -> appfuse-basic-jsf (AppFuse archetype for creating a web application with Hibernate, Spring and JSF)
          2: internal -> appfuse-basic-spring (AppFuse archetype for creating a web application with Hibernate, Spring and Spring MVC)
          3: internal -> appfuse-basic-struts (AppFuse archetype for creating a web application with Hibernate, Spring and Struts 2)
          4: internal -> appfuse-basic-tapestry (AppFuse archetype for creating a web application with Hibernate, Spring and Tapestry 4)
          5: internal -> appfuse-core (AppFuse archetype for creating a jar application with Hibernate and Spring and XFire)
          6: internal -> appfuse-modular-jsf (AppFuse archetype for creating a modular application with Hibernate, Spring and JSF)
          7: internal -> appfuse-modular-spring (AppFuse archetype for creating a modular application with Hibernate, Spring and Spring MVC)
          8: internal -> appfuse-modular-struts (AppFuse archetype for creating a modular application with Hibernate, Spring and Struts 2)
          9: internal -> appfuse-modular-tapestry (AppFuse archetype for creating a modular application with Hibernate, Spring and Tapestry 4)
          10: internal -> maven-archetype-j2ee-simple (A simple J2EE Java application)
          11: internal -> maven-archetype-marmalade-mojo (A Maven plugin development project using marmalade)
          12: internal -> maven-archetype-mojo (A Maven Java plugin development project)
          13: internal -> maven-archetype-portlet (A simple portlet application)
          14: internal -> maven-archetype-profiles ()
          15: internal -> maven-archetype-quickstart ()
          16: internal -> maven-archetype-site-simple (A simple site generation project)
          17: internal -> maven-archetype-site (A more complex site project)
          18: internal -> maven-archetype-webapp (A simple Java web application)
          19: internal -> struts2-archetype-starter (A starter Struts 2 application with Sitemesh, DWR, and Spring)
          20: internal -> struts2-archetype-blank (A minimal Struts 2 application)
          21: internal -> struts2-archetype-portlet (A minimal Struts 2 application that can be deployed as a portlet)
          22: internal -> struts2-archetype-dbportlet (A starter Struts 2 portlet that demonstrates a simple CRUD interface with db backing)
          23: internal -> struts2-archetype-plugin (A Struts 2 plugin)
          24: internal -> shale-archetype-blank (A blank Shale web application with JSF)
          25: internal -> maven-adf-archetype (Archetype to ease the burden of creating a new application based with ADF)
          26: internal -> data-app (A new Databinder application with sources and resources.)
          27: internal -> jini-service-archetype (Archetype for Jini service project creation)
          28: internal -> softeu-archetype-seam (JSF+Facelets+Seam Archetype)
          29: internal -> softeu-archetype-seam-simple (JSF+Facelets+Seam (no persistence) Archetype)
          30: internal -> softeu-archetype-jsf (JSF+Facelets Archetype)
          31: internal -> jpa-maven-archetype (JPA application)
          32: internal -> spring-osgi-bundle-archetype (Spring-OSGi archetype)
          33: internal -> confluence-plugin-archetype (Atlassian Confluence plugin archetype)
          34: internal -> maven-archetype-har (Hibernate Archive)
          35: internal -> maven-archetype-sar (JBoss Service Archive)
          36: internal -> wicket-archetype-quickstart (A simple Apache Wicket project)
          posted @ 2015-06-10 11:39 Eric_jiang 閱讀(162) | 評論 (0)編輯 收藏

          1. package com.test.dbtest;  
          2.   
          3. import java.sql.CallableStatement;  
          4. import java.sql.Connection;  
          5. import java.sql.DriverManager;  
          6. import java.sql.ResultSet;  
          7. import java.sql.SQLException;  
          8. import java.sql.Statement;  
          9.   
          10. /**Jdbc 連接 Oracle 數據庫 簡單示例 
          11.  *@author wanggq 
          12.  *@version 創建時間:2014年3月31日 上午11:00:06 
          13.  *類說明 
          14.  */  
          15. public class TestO_procedure01 {  
          16.   
          17.     public static void main(String[] args) {  
          18.         String driver = "oracle.jdbc.driver.OracleDriver";  
          19.         String url = "jdbc:Oracle:thin:@localhost:1521:orcl";  
          20.         Statement stmt = null;  
          21.         ResultSet res = null;  
          22.         Connection conn = null;  
          23.         CallableStatement proc = null;  
          24.         String sql = " select T.REC_NO, T.AIRLINE,T.DEPARTURE,T.ARRIVAL from CDP_MAIN_ORDER t where t.departure=upper('pek')";  
          25.           
          26.         try {  
          27.             Class.forName(driver);  
          28.             conn = DriverManager.getConnection(url, "abc123", "abc123");  
          29.             stmt = conn.createStatement();  
          30.             res = stmt.executeQuery(sql);  
          31.             while(res.next())  
          32.             {  
          33.                 String rec = res.getString("REC_NO");  
          34.                 String airline = res.getString("AIRLINE");  
          35.                 String dept = res.getString("DEPARTURE");  
          36.                 String arr = res.getString("ARRIVAL");  
          37.                 System.out.println(rec+" "+airline+" "+dept+" "+arr);  
          38.             }  
          39.               
          40.         } catch (ClassNotFoundException e) {  
          41.             // TODO Auto-generated catch block  
          42.             e.printStackTrace();  
          43.         } catch (SQLException e) {  
          44.             // TODO Auto-generated catch block  
          45.             e.printStackTrace();  
          46.         }  
          47.           
          48.           
          49.           
          50.   
          51.     }  
          52.   
          53. }  

          也可以使用防止SQL注入PreparedStatement方法

          1. PreparedStatement stmt = null;  
          2. ResultSet res = null;  
          3. Connection conn = null;  
          4. CallableStatement proc = null;  
          5. String sql = " select T.REC_NO, T.AIRLINE,T.DEPARTURE,T.ARRIVAL from CDP_MAIN_ORDER t where t.departure=upper(?)";  
          6.   
          7. try {  
          8.     Class.forName(driver);  
          9.     conn = DriverManager.getConnection(url, "abc123", "abc123");  
          10.     stmt = conn.prepareStatement(sql);  
          11.     stmt.setString(1, "pek");  
          12.     res = stmt.executeQuery();  
          posted @ 2015-06-09 11:48 Eric_jiang 閱讀(224) | 評論 (0)編輯 收藏

               摘要: 在windows系統中,windows提供了計劃任務這一功能,在控制面板 -> 性能與維護 -> 任務計劃, 它的功能就是安排自動運行的任務。 通過'添加任務計劃'的一步步引導,則可建立一個定時執行的任務。在linux系統中你可能已經發現了為什么系統常常會自動的進行一些任務?這些任務到底是誰在支配他們工作的?在linux系統如...  閱讀全文
          posted @ 2015-06-04 17:19 Eric_jiang 閱讀(179) | 評論 (0)編輯 收藏

          我在上傳些代碼的時候,有時候會遇到“git did not exit cleanly (exit code 128)”錯誤。通常都是網絡原因。

          找了網上解決的方法:

          \

          1、鼠標右鍵 -> TortoiseGit -> Settings -> Network

          2、SSH client was pointing to C:\Program Files\TortoiseGit\bin\TortoisePlink.exe

          3、Changed path to C:\Program Files (x86)\Git\bin\ssh.exe

          posted @ 2015-06-03 17:42 Eric_jiang 閱讀(283) | 評論 (0)編輯 收藏

          JDK內置工具使用

          一、javah命令(C Header and Stub File Generator)

          二、jps命令(Java Virtual Machine Process Status Tool)

          三、jstack命令(Java Stack Trace)

          四、jstat命令(Java Virtual Machine Statistics Monitoring Tool)

          五、jmap命令(Java Memory Map)

          六、jinfo命令(Java Configuration Info)

          七、jconsole命令(Java Monitoring and Management Console)

          八、jvisualvm命令(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool)

          九、jhat命令(Java Heap Analyse Tool)

          十、Jdb命令(The Java Debugger)

          十一、Jstatd命令(Java Statistics Monitoring Daemon)

           
          posted @ 2015-05-15 22:34 Eric_jiang 閱讀(280) | 評論 (0)編輯 收藏

          jstack用于打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支持以下的這種方式:
               jstack [-l][F] pid
               如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。進程處于hung死狀態可以用-F強制打出stack。
               dump 文件里,值得關注的線程狀態有:
               死鎖,Deadlock(重點關注)
               執行中,Runnable  
               等待資源,Waiting on condition(重點關注)
               等待獲取監視器,Waiting on monitor entry(重點關注)
               暫停,Suspended
               對象等待中,Object.wait() 或 TIMED_WAITING
               阻塞,Blocked(重點關注) 
               停止,Parked

          在摘了另一篇博客的三種場景:

          實例一:Waiting to lock 和 Blocked

          復制代碼
          "RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae waiting for monitor entry [0x00007fd4f8684000]    java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.log4j.Category.callAppenders(Category.java:201) - waiting to lock <0x00000000acf4d0c0> (a org.apache.log4j.Logger) at org.apache.log4j.Category.forcedLog(Category.java:388) at org.apache.log4j.Category.log(Category.java:853) at org.apache.commons.logging.impl.Log4JLogger.warn(Log4JLogger.java:234) at com.tuan.core.common.lang.cache.remote.SpyMemcachedClient.get(SpyMemcachedClient.java:110)
          復制代碼

          說明:
          1)線程狀態是 Blocked,阻塞狀態。說明線程等待資源超時!
          2)“ waiting to lock <0x00000000acf4d0c0>”指,線程在等待給這個 0x00000000acf4d0c0 地址上鎖(英文可描述為:trying to obtain  0x00000000acf4d0c0 lock)。
          3)在 dump 日志里查找字符串 0x00000000acf4d0c0,發現有大量線程都在等待給這個地址上鎖。如果能在日志里找到誰獲得了這個鎖(如locked < 0x00000000acf4d0c0 >),就可以順藤摸瓜了。
          4)“waiting for monitor entry”說明此線程通過 synchronized(obj) {……} 申請進入了臨界區,從而進入了下圖1中的“Entry Set”隊列,但該 obj 對應的 monitor 被其他線程擁有,所以本線程在 Entry Set 隊列中等待。
          5)第一行里,"RMI TCP Connection(267865)-172.16.5.25"是 Thread Name 。tid指Java Thread id。nid指native線程的id。prio是線程優先級。[0x00007fd4f8684000]是線程棧起始地址。

          實例二:Waiting on condition 和 TIMED_WAITING

          復制代碼
          "RMI TCP Connection(idle)" daemon prio=10 tid=0x00007fd50834e800 nid=0x56b2 waiting on condition [0x00007fd4f1a59000]    java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for  <0x00000000acd84de8> (a java.util.concurrent.SynchronousQueue$TransferStack) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:424) at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:323) at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:874) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:662)
          復制代碼

           

          說明:

          1)“TIMED_WAITING (parking)”中的 timed_waiting 指等待狀態,但這里指定了時間,到達指定的時間后自動退出等待狀態;parking指線程處于掛起中。

          2)“waiting on condition”需要與堆棧中的“parking to wait for  <0x00000000acd84de8> (a java.util.concurrent.SynchronousQueue$TransferStack)”結合來看。首先,本線程肯定是在等待某個條件的發生,來把自己喚醒。其次,SynchronousQueue 并不是一個隊列,只是線程之間移交信息的機制,當我們把一個元素放入到 SynchronousQueue 中時必須有另一個線程正在等待接受移交的任務,因此這就是本線程在等待的條件。
          3)別的就看不出來了。

          實例三:in Obejct.wait() 和 TIMED_WAITING

          復制代碼
          "RMI RenewClean-[172.16.5.19:28475]" daemon prio=10 tid=0x0000000041428800 nid=0xb09 in Object.wait() [0x00007f34f4bd0000]    java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000000aa672478> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) - locked <0x00000000aa672478> (a java.lang.ref.ReferenceQueue$Lock) at sun.rmi.transport.DGCClient$EndpointEntry$RenewCleanThread.run(DGCClient.java:516) at java.lang.Thread.run(Thread.java:662)
          復制代碼

          說明:

          1)“TIMED_WAITING (on object monitor)”,對于本例而言,是因為本線程調用了 java.lang.Object.wait(long timeout) 而進入等待狀態。

          2)“Wait Set”中等待的線程狀態就是“ in Object.wait() ”。當線程獲得了 Monitor,進入了臨界區之后,如果發現線程繼續運行的條件沒有滿足,它則調用對象(一般就是被 synchronized 的對象)的 wait() 方法,放棄了 Monitor,進入 “Wait Set”隊列。只有當別的線程在該對象上調用了 notify() 或者 notifyAll() ,“ Wait Set”隊列中線程才得到機會去競爭,但是只有一個線程獲得對象的 Monitor,恢復到運行態。

          3)RMI RenewClean 是 DGCClient 的一部分。DGC 指的是 Distributed GC,即分布式垃圾回收。

          4)請注意,是先 locked <0x00000000aa672478>,后 waiting on <0x00000000aa672478>,之所以先鎖再等同一個對象,請看下面它的代碼實現:
          static private class  Lock { };
          private Lock lock = new Lock();
          public Reference<? extends T> remove(long timeout)
          {
              synchronized (lock) {
                  Reference<? extends T> r = reallyPoll();
                  if (r != null) return r;
                  for (;;) {
                      lock.wait(timeout);
                      r = reallyPoll();
                      ……
                 }
          }
          即,線程的執行中,先用 synchronized 獲得了這個對象的 Monitor(對應于  locked <0x00000000aa672478> );當執行到 lock.wait(timeout);,線程就放棄了 Monitor 的所有權,進入“Wait Set”隊列(對應于  waiting on <0x00000000aa672478> )。
          5)從堆棧信息看,是正在清理 remote references to remote objects ,引用的租約到了,分布式垃圾回收在逐一清理呢。

          參考:

          命令匯總:http://blog.csdn.net/fenglibing/article/details/6411940
          三種實例:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html

          posted @ 2015-05-15 22:24 Eric_jiang 閱讀(442) | 評論 (0)編輯 收藏

          1. 如何加大tomcat連接數

          在tomcat配置文件server.xml中的<Connector ... />配置中,和連接數相關的參數有:

          maxThreads : tomcat起動的最大線程數,即同時處理的任務個數,默認值為200。

          minProcessors:最小空閑連接線程數,用于提高系統處理性能,默認值為10 。

          maxProcessors:最大連接線程數,即:并發處理的最大請求數,默認值為75 。

          acceptCount: 當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值為100。

          minSpareThreads :Tomcat初始化時創建的線程數。

          maxSpareThreads :一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。

          enableLookups:是否反查域名,取值為:true或false。 缺省值為false,表示使用客戶端主機名的DNS解析功能,被ServletRequest.getRemoteHost方法調用。

          connectionTimeout:網絡連接超時,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為30000毫秒。


          其中和最大連接數相關的參數為maxProcessors和acceptCount。如果要加大并發連接數,應同時加大這兩個參數。

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

          Unix中如何設置這些參數,請參閱Unix常用監控和管理命令

          tomcat5中的配置示例:

          <Connector port="8090" maxHttpHeaderSize="8169"  maxThreads="1000" minSpareThreads="75" maxSpareThreads="300"               enableLookups="false" redirectPort="8649" acceptCount="100" connectionTimeout="50000" disableUploadTimeout="true" URIEncoding="GBK"/>

          <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8080" minProcessors="10" maxProcessors="1024" enableLookups="false" redirectPort="8443" acceptCount="1024" debug="0" connectionTimeout="30000" /> 
          對于其他端口的偵聽配置,以此類推。
          2. tomcat中如何禁止列目錄下的文件

          在{tomcat_home}/conf/web.xml中,把listings參數設置成false即可,如下:

          <servlet> ... <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> ... </servlet>


          3. 如何加大tomcat可以使用的內存

          tomcat默認可以使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,需要調大。
          Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下設置:

          JAVA_OPTS='-Xms【初始化內存大小】 -Xmx【可以使用的最大內存】' 需要把這個兩個參數值調大。

          例如: JAVA_OPTS='-Xms256m -Xmx512m' 表示初始化內存為256MB,可以使用的最大內存為512MB 。

           

          export JAVA_HOME='/home/ftpuser/xjSheetHome/java/jdk1.5.0_22/'

          JAVA_OPTS="-Xms1500m -Xmx1500m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m -Dfile.encoding=GBK"

          參數說明:

          -Xms 是指設定程序啟動時占用內存大小。一般來講,大點,程序會啟動的 快一點,但是也可能會導致機器暫時間變慢。

          -Xmx 是指設定程序運行期間最大可占用的內存大小。如果程序運行需要占 用更多的內存,超出了這個設置值,就會拋出OutOfMemory 異常。

          -Xss 是指設定每個線程的堆棧大小。這個就要依據你的程序,看一個線程 大約需要占用多少內存,可能會有多少線程同時運行等。

          -XX:PermSize設置非堆內存初始值,默認是物理內存的1/64 。

          -XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。

           

           

           

          <Context path="/Sheet" defaultSessionTimeOut="3600" docBase="/home/user/Sheet"  >
            <Resource name="jdbc/app" auth="Container"
                                  type="javax.sql.DataSource"
                                  username="SHEET" password="SHEET"
                      driverClassName="oracle.jdbc.driver.OracleDriver"
                      url="jdbc:oracle:thin:@136.24.248.106:1521:kf"
                      maxActive="1000" maxIdle="75"/>
            <ResourceLink name="UserTransaction"
                      global="UserTransaction"
                      type="javax.transaction.UserTransaction"/>
          </Context>
          參數說明:
          defaultSessionTimeOut:設置會話時間 單位為秒
          maxActive : 連接池的最大數據庫連接數。設為0表示無限制。
          maxIdle :可以同時閑置在連接池中的連接的最大數  
          maxWait : 最大超時時間,以毫秒計

          posted @ 2015-05-11 16:11 Eric_jiang 閱讀(212) | 評論 (1)編輯 收藏

               摘要: 首先先介紹一款知名的網站壓力測試工具:webbench. Webbench能測試處在相同硬件上,不同服務的性能以及不同硬件上同一個服務的運行狀況。webbench的標準測試可以向我們展示服務器的兩項內容:每分鐘相應請求數和每秒鐘傳輸數據量。webbench不但能具有便準靜態頁面的測試能力,還能對動態頁面(ASP,PHP,JAVA,CGI)進 行測試的能力。還有就是他支持對含有SSL的安全網站例如...  閱讀全文
          posted @ 2015-05-11 16:03 Eric_jiang 閱讀(219) | 評論 (0)編輯 收藏

          1.內存設置(VM參數調優)
          (1). Windows環境下,是tomcat解壓版(執行startup.bat啟動tomcat) ,解決辦法:
          修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件開頭增加如下設置:
          set JAVA_OPTS=-Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=512m
          備注:一定加在catalina.bat最前面。
          (2). Windows環境下,是tomcat安裝版(利用windows的系統服務啟動tomcat),解決辦法:
          修改注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat6\Parameters\JavaOptions
          原值為:
          -Dcatalina.home=E:\Tomcat 6.0
          -Dcatalina.base=E:\Tomcat 6.0
          -Djava.endorsed.dirs=E:\Tomcat 6.0\common\endorsed
          -Djava.io.tmpdir=E:\Tomcat 6.0\temp
          -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
          -Djava.util.logging.config.file=E:\Tomcat 6.0\conf\logging.properties
          加入:
          Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=512m
          重起tomcat服務,設置生效。
          (3). Linux環境下, ,解決辦法:
          修改“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件開頭增加如下設置:JAVA_OPTS=’-Xms256m -Xmx512m’

          各參數詳解:
          -Xms:設置JVM初始內存大小(默認是物理內存的1/64)
          -Xmx:設置JVM可以使用的最大內存(默認是物理內存的1/4,建議:物理內存80%)
          -Xmn:設置JVM最小內存(128-256m就夠了,一般不設置)

          默認空余堆內存小于 40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大于70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設置-Xms、 -Xmx相等以避免在每次GC 后調整堆的大小。
          在較大型的應用項目中,默認的內存是不夠的,有可能導致系統無法運行。常見的問題是報Tomcat內存溢出錯誤“java.lang.OutOfMemoryError: Java heap space”,從而導致客戶端顯示500錯誤。

          -XX:PermSize :為JVM啟動時Perm的內存大小
          -XX:MaxPermSize :為最大可占用的Perm內存大小(默認為32M)
          -XX:MaxNewSize,默認為16M

          PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的應用中有很CLASS的話,就很可能出現“java.lang.OutOfMemoryError: PermGen space”錯誤。
          對于WEB項目,jvm加載類時,永久域中的對象急劇增加,從而使jvm不斷調整永久域大小,為了避免調整),你可以使用更多的參數配置。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小,那么就會產生此錯誤信息了。
          其它參數:
          -XX:NewSize :默認為2M,此值設大可調大新對象區,減少Full GC次數
          -XX:NewRatio :改變新舊空間的比例,意思是新空間的尺寸是舊空間的1/8(默認為8)
          -XX:SurvivorRatio :改變Eden對象空間和殘存空間的尺寸比例,意思是Eden對象空
          間的尺寸比殘存空間大survivorRatio+2倍(缺省值是10)
          -XX:userParNewGC 可用來設置并行收集【多CPU】
          -XX:ParallelGCThreads 可用來增加并行度【多CPU】
          -XXUseParallelGC 設置后可以使用并行清除收集器【多CPU】

          2.修改tomcat讓其支持NIO
          修改前:
          protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
          修改成支持NIO的類型,配置如下 :
          protocol="org.apache.coyote.http11.Http11NioProtocol " connectionTimeout="20000" redirectPort="8443" />
          3.并發數設置
          默認的tomcat配置,并發測試時,可能30個USER上去就當機了。
          添加

          maxThreads="600" //最大線程數
          minSpareThreads="100" //初始化時創建的線程數
          maxSpareThreads="500" //一旦線程超過這個值,Tomcat會關閉不需要的socket線程
          acceptCount="700"http://指定當所有可以使用的處理請求的線程數都被使用時,可以放到
          處理隊列中的請求數,超過這個數的請求將不予處理

          connectionTimeout="20000"
          redirectPort="8443" />

          或者
          name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="400" />

          executor="tomcatThreadPool" port="80" protocol="HTTP/1.1" connectionTimeout="20000" enableLookups="false"
          redirectPort="8443" URIEncoding="UTF-8" acceptCount="1000" />
          4.Java虛擬機調優
          應該選擇SUN的JVM,在滿足項目需要的前提下,盡量選用版本較高的JVM,一般來說高版本產品在速度和效率上比低版本會有改進。 JDK1.4比JDK1.3性能提高了近10%-20%,JDK1.5比JDK1.4性能提高25%-75%。
          5.禁用DNS查詢
          設置enableLookups="false":
          enableLookups="false" redirectPort="8443" URIEncoding="UTF-8" acceptCount="1000" />
           當web應用程序向要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者通過域名服務器查找機器名轉換為IP地址。DNS查詢需要占用網絡,并且包括可能從很多很遠的服務器或者不起作用的服務器上去獲取對應的IP的過程,這樣會消耗一定的時間。為了消除DNS查詢對性能的影響我們可以關閉 DNS查詢,方式是修改server.xml文件中的enableLookups參數值為false。
          6.設置解決亂碼問題
          URIEncoding="UTF-8" acceptCount="1000" />

          二、TOMCAT內存監控

          1.設置tomcat的perm size:

          2.開啟監控

          在命令行輸入jconsole,在彈出窗口中建立本地端口監控,如下圖:

           

          使用安裝版Tomcat 6.0 ,打開tomcat界面選擇java這一項,在java options:
          加入

          Java代碼 復制代碼 收藏代碼
          1. -Djava.rmi.server.hostname=127.0.0.1 
          2. -Dcom.sun.management.jmxremote.port=8088 
          3. -Dcom.sun.management.jmxremote.ssl=false 
          4. -Dcom.sun.management.jmxremote.authenticate=false 
          1. -Djava.rmi.server.hostname=127.0.0.1  
          2. -Dcom.sun.management.jmxremote.port=8088  
          3. -Dcom.sun.management.jmxremote.ssl=false  
          4. -Dcom.sun.management.jmxremote.authenticate=false  

          使用jconsole 127.0.0.1:8088可以連接成功,也能看到jvm運行情況,
          但此時訪問已經部署的應用,卻提示“無法顯示網頁”
          今天又研究了一會,猜想了一下是不是這個端口獨占的,不能和應用沖突,把Dcom.sun.management.jmxremote.port=8088 改為80, 重啟tomcat 果然,應用可以訪問。之后去網上看來些相關信息,確實為兩個端口,不能占用。

          posted @ 2015-05-11 15:58 Eric_jiang 閱讀(170) | 評論 (0)編輯 收藏

          僅列出標題
          共57頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 文成县| 沛县| 基隆市| 泌阳县| 肇州县| 红安县| 穆棱市| 伊川县| 高要市| 保德县| 连云港市| 灵川县| 宁夏| 铜鼓县| 岢岚县| 同德县| 那坡县| 泸州市| 闽侯县| 科技| 泊头市| 左贡县| 莲花县| 津南区| 郸城县| 晋江市| 蕉岭县| 鞍山市| 共和县| 永康市| 佛山市| 武邑县| 罗定市| 皮山县| 延吉市| 东兴市| 鹤峰县| 新丰县| 湘乡市| 章丘市| 天门市|