当我试图在我的mac上运行我的Junittesting时,我总是得到这个exception:
java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:658) at java.util.concurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize(ThreadPoolExecutor.java:727) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:657) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:92) at com.google.appengine.tools.development.ApiProxyLocalImpl$PrivilegedApiAction.run(ApiProxyLocalImpl.java:197) at com.google.appengine.tools.development.ApiProxyLocalImpl$PrivilegedApiAction.run(ApiProxyLocalImpl.java:184) at java.security.AccessController.doPrivileged(Native Method) at com.google.appengine.tools.development.ApiProxyLocalImpl.doAsyncCall(ApiProxyLocalImpl.java:172) at com.google.appengine.tools.development.ApiProxyLocalImpl.makeAsyncCall(ApiProxyLocalImpl.java:138)
同样的unit testing在Ubuntu和Windows上通过的很好。
有关我的系统资源在mac上的一些信息:
$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 1 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 266 virtual memory (kbytes, -v) unlimited $ java -version java version "1.6.0_24" Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-10M3326) Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)
我不认为这是一个应用程序问题的原因是因为相同的testing通过不同的环境。 我已经尝试设置堆1024m,512m和堆栈设置为64k和128k(以及这些组合),没有运气。 我打开的文件最初是256,我碰到这个到1024。
我一直在search一下,所有的post都说减less堆大小和增加堆栈大小,但似乎没有帮助。 任何人有更多的想法?
编辑:这里是我的Ubuntu的盒子上的一些环境信息:
$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited $ java -version java version "1.6.0_24" Java(TM) SE Runtime Environment (build 1.6.0_24-b07) Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
这可能是您正在访问的max user processes 。 尝试增加到像1024的东西。
ulimit -u 1024
这是全局的限制,所以检查出sysctl.conf并看看输出:
sysctl kern.maxprocperuid kern.maxproc
并根据需要进行调整。
分配更多的内存给jvm。 通常这是原因。 如果你有1GB的存储空间,可以添加0.5GB或者1.根据你的RAM,你必须为操作系统进程保留1-2GB的内存。 不要分配比你更多的内存。
正如马特所说,这可能是打开的文件太多的问题,但在这种情况下,你应该看到这样的信息。 在日志中search它。
堆栈大小(千字节,-s)8192
对于大型multithreading应用程序来说,这个值太大了。 如果您正在旋转很multithreading,请尝试将其设置为1024,使用ulimit -s或在/etc/security/limits.conf中
另一种方法是调整JVM堆栈大小,如下所述:使用Javas -Xss非标准选项防止“OutOfMemory:无法创build新线程” (另请参阅工具文档 )
这可能是一个可行的select,只要它没有权力控制/减less线程数量(例如,当罪魁祸首是第三方的lib或框架,你是不允许的)