调整Tomcat内存和cpu消耗 [英] Tuning Tomcat memory and cpu consumption

查看:598
本文介绍了调整Tomcat内存和cpu消耗的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Java Web应用程序,可以很好地处理文件约定.
我正在使用Tomcat 6作为我的servlet容器.当提交许多请求时,Tomcat变得非常消耗内存.我不知道如何微调tomcat以减少内存消耗. 我也在考虑更改我的servlet容器.
你有什么建议?

I have a Java web application that works a lot with file conventions.
I am using Tomcat 6 as my servlet container. When many requests are submitted, Tomcat becomes very memory hungry. I wonder how I can fine-tune tomcat to reduce the memory consumption. I am also considering changing my servlet container.
What do you suggest?

推荐答案

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

You can limit the accepted/operational connection numbers in the conf/server.xml configuration.

<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'/>

在配置文件中,这应该会刹车.

in the config file and this should brake you.

根据您的评论,您可以根据CPU数量(Runtime.getRuntime().availableProcessors())将处理移到专用线程池中(请参阅 RejectedExecutionHandler 在队列添加时进行阻塞添加变满了.)

Based on your comment you could move the processing into dedicated thread pool sized according to your CPU count (Runtime.getRuntime().availableProcessors()) (see ExecutorService and Executors.) Then you could apply a bounded LinkedBlockingQueue to throttle the number of pending tasks (don't forget to specify a RejectedExecutionHandler to do the blocking add when the queue gets full).

添加了指向类的链接.在那里,您可以找到一些样本.

Edit 2: Added links to the classes. There you find some samples.

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

Edit 3: A sample method I used in a project.

/**
 * 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;
}

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

And you could use it this way:

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

在您的servlet中

And in your servlet

ExecutorService exec = (ExecutorService)servletContext
.getAttribute("converter pool");

exec.submit(new Runnable() {
    public void run() {
        // your code for transformation goes here
    }
}

这篇关于调整Tomcat内存和cpu消耗的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆