0

我在使用 JVM 时遇到了一些问题;我有一个网页和一个没有 GUI(UDP 服务器)的应用程序,两者都使用相同的数据库,应用程序(UDP 服务器)工作正常,但如果 Web 应用程序内存不足,整个 JVM 就会停止;所以我想把UDP服务器放在不同的JVM中。

我收到以下消息

2013 年 5 月 21 日下午 5:24:05 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
严重:Web 应用程序 [/track] 创建了一个 ThreadLocal,其键类型为 [org.opengts.util.ThreadLocalMap$1](值 [org .opengts.util.ThreadLocalMap$1@277085a4]) 和 [java.util.Hashtable] 类型的值(值 [{jdbc:mysql://localhost:3306/gts?characterEncoding=UTF-8&useUnicode=true&characterSetResults=utf8=org .opengts.dbtools.DBConnection@22236dae}]),但在 Web 应用程序停止时未能将其删除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。

当我重新启动网页时

May 21, 2013 5:24:20 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2695 ms
Exception in thread "http-bio-8080-Acceptor-0" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:657)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:943)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1336)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:156)
at org.apache.tomcat.util.net.JIoEndpoint.processSocket(JIoEndpoint.java:510)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:229)
at java.lang.Thread.run(Thread.java:679)
Exception in thread "http-bio-8080-exec-8" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:657)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:943)
at java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:992)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:679)

新信息

我尝试了 ulimit 命令得到以下结果。

ulimit
unlimited
ulimit -Hn
163840
ulimit -n
163840
ulimit -u
1024

现在我想知道这些数字的含义是什么?它们是以 MB 为单位的进程或内存量?

4

3 回答 3

2

您必须在不同的端口上运行 Web 服务器,所以这不是 JVM 问题 - 这是 catalina 的配置

于 2013-05-21T21:08:14.793 回答
1

“java.lang.OutOfMemoryError:无法创建新的本机线程”错误根本不是内存不足错误——由于操作系统限制,JVM 无法创建新线程。

您使用的是什么操作系统?在 linux 上,您可以通过执行以下操作来增加它:

ulimit -u <new limit>
于 2013-05-21T21:12:06.490 回答
0

在创建新的 JVM 之前,我会先检查线程的创建。

在添加之前,我在线程数限制方面遇到了同样的问题

executor.shutdown(); 

对于 finally 块中的 ExecutorService

于 2013-05-21T21:26:31.017 回答