调整Tomcat内存和cpu消耗

我有一个Java Web应用程序,可以很好地处理文件约定。

我正在使用Tomcat

6作为我的servlet容器。当提交许多请求时,Tomcat变得非常消耗内存。我想知道如何微调tomcat以减少内存消耗。我也在考虑更改我的servlet容器。

你有什么建议?

回答:

您可以在conf/server.xml配置中限制可接受/可操作的连接数。

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 

maxThreads="16" minSpareThreads="1"/>

<Connector executor="tomcatThreadPool"

port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

/>

要么

<Connector port="8080" protocol="HTTP/1.1" 

connectionTimeout="20000"

redirectPort="8443"

maxThreads='16'/>

在配置文件,这应该刹车。

根据您的评论,您可以根据CPU计数(Runtime.getRuntime().availableProcessors())将处理移到专用线程池中(请参阅ExecutorService和Executors。)然后您可以应用有界LinkedBlockingQueue来限制待处理任务的数量(不要忘记指定RejectedExecutionHandler来在队列已满时进行阻塞添加)。

添加到类的链接。在那里您可以找到一些样本。

我在项目中使用的示例方法。

/**

* Creates a new thread pool based on some attributes

* @param poolSize the number of worker threads in the thread pool

* @param poolName the name of the thread pool (for debugging purposes)

* @param priority the base priority of the worker threads

* @param capacity the size of the task queue used

* @return the ExecutorService object

*/

private ExecutorService newPool(int poolSize,

String poolName, final int priority, int capacity) {

int cpu = Runtime.getRuntime().availableProcessors();

ExecutorService result = null;

if (poolSize != 0) {

if (poolSize == -1) {

poolSize = cpu;

}

if (capacity <= 0) {

capacity = Integer.MAX_VALUE;

}

result = new ThreadPoolExecutor(poolSize, poolSize,

120, TimeUnit.MINUTES,

new LinkedBlockingQueue<Runnable>(capacity),

new ThreadFactory() {

@Override

public Thread newThread(Runnable runnable) {

Thread t = new Thread(runnable);

t.setPriority(priority);

return t;

}

}, new RejectedExecutionHandler() {

@Override

public void rejectedExecution(Runnable r,

ThreadPoolExecutor executor) {

if (!executor.isShutdown()) {

try {

executor.getQueue().put(r);

} catch (InterruptedException ex) {

// give up

}

}

}

});

}

return result;

}

您可以通过以下方式使用它:

ExecutorService exec = newPool(-1, "converter pool", Thread.NORM_PRIORITY, 500);

servletContext.setAttribute("converter pool", exec);

并在您的servlet中

ExecutorService exec = (ExecutorService)servletContext

.getAttribute("converter pool");

exec.submit(new Runnable() {

public void run() {

// your code for transformation goes here

}

}

以上是 调整Tomcat内存和cpu消耗 的全部内容, 来源链接: utcz.com/qa/416874.html

回到顶部