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 阅读(158) | 评论 (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 阅读(144) | 评论 (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 阅读(209) | 评论 (0)编辑 收藏

     摘要: 在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务。 通过'添加任务计划'的一步步引导,则可建立一个定时执行的任务。在linux系统中你可能已经发现了为什么系统常常会自动的进行一些任务?这些任务到底是谁在支配他们工作的?在linux系统如...  阅读全文
posted @ 2015-06-04 17:19 Eric_jiang 阅读(163) | 评论 (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 阅读(262) | 评论 (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 阅读(220) | 评论 (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 阅读(425) | 评论 (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 阅读(193) | 评论 (1)编辑 收藏

     摘要: 首先先介绍一款知名的网站压力测试工具:webbench. Webbench能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webbench的标准测试可以向我们展示服务器的两项内容:每分钟相应请求数和每秒钟传输数据量。webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进 行测试的能力。还有就是他支持对含有SSL的安全网站例如...  阅读全文
posted @ 2015-05-11 16:03 Eric_jiang 阅读(204) | 评论 (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"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到
处理队列中的请求数,超过这个数的请求将不予处理

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 阅读(142) | 评论 (0)编辑 收藏

仅列出标题
共57页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last