Java 无特权用户上maven内存不足

Java 无特权用户上maven内存不足,java,maven,ubuntu,centos,out-of-memory,Java,Maven,Ubuntu,Centos,Out Of Memory,在CentOS机器上运行maven测试时,我遇到了奇怪的maven问题。问题是,当我跑的时候 mvn install 作为非特权用户,它将永远挂起,但有以下例外 java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:713) at org.apache.maven.

在CentOS机器上运行maven测试时,我遇到了奇怪的maven问题。问题是,当我跑的时候

mvn install
作为非特权用户,它将永远挂起,但有以下例外

java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:713)
at org.apache.maven.surefire.booter.ForkedBooter.launchLastDitchDaemonShutdownThread(ForkedBooter.java:181)
at org.apache.maven.surefire.booter.ForkedBooter.exit(ForkedBooter.java:141)
at org.apache.maven.surefire.booter.ForkedBooter.exit(ForkedBooter.java:141)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:125)

Exception in thread "main" Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native threadjava.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:713)
at org.apache.maven.surefire.booter.ForkedBooter.launchLastDitchDaemonShutdownThread(ForkedBooter.java:181) at org.apache.maven.surefire.booter.ForkedBooter.launchLastDitchDaemonShutdownThread(ForkedBooter.java:181)
at org.apache.maven.surefire.booter.ForkedBooter.exit(ForkedBooter.java:141)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:133)

Exception in thread "metrics-meter-tick-thread-1" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:713)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
at java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:1017)  at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
at java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:1017)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1163)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
at java.lang.Thread.run(Thread.java:744)
但是,如果我以root的身份运行mvn,则没有问题。 另外,在Ubuntu框中,作为非特权用户,测试运行正常

我的堆栈:

  • Maven出现在3.0.5和3.1.1上
  • CentOS 6.5内核2.6.32-431.3.1.el6.x86_64
  • Ubuntu 13.10内核3.11.0-15-generic
  • JDK1.7.0_51(在ubuntu和CentOS上)
一切都是香草味的

其他事实:

  • $MAVEN_选项不在任何shell(CentOS或Ubuntu)中设置。我确实尝试了MAVEN_OPTS=“-Xms256m-Xmx4096m-XX:MaxPermSize=256m-Dmaven.surefire.debug=-xmx300m”的组合,但结果相同
  • $JAVA_选项也不在任何shell中设置。我尝试了与上面类似的选择,但由于没有效果,我放弃了它
  • 尝试为我尝试的每个用户在~/.m2目录中参数化surefire插件,但没有任何结果,因此我放弃了配置
  • 从pstree中,我看到maven的java在所有情况下都会创建~1060个进程的分叉
谁能解释一下发生了什么事


非常感谢

我的设置与您的类似,只是我运行的是CentOS 6.4,使用的是jdk 1.6。为了让Maven在更大的构建上工作,我必须设置

export MAVEN_OPTS="-Xms256M -Xmx1024M -XX:MaxPermSize=512M"

当我使用bash时,我将此设置和其他与Maven相关的设置放在
/mvn.sh
目录下的
/etc/profile.d
文件中。

这不完全是一个答案

我终于转到了Ubuntu服务器,一切都正常运行。我重复一遍,这两个安装都是普通的,开箱即用,没有定制(并不意味着我没有尝试任何)。我重新安装了CentOS box两次,以确保没有留下任何错误配置。所以对于我们的测试,我不推荐CentOS用于maven


如果你对正在发生的事情有任何想法,请随时回答。我可以随时更改已接受的答案

java.lang.OutOfMemoryError:无法创建新的本机线程

这是重要的部分。OutOfMemoryError已扩展为“无法分配一些基本资源”。在本例中,是新线程,而不是内存

可能的解释是:对于普通用户,您的“ulimit”线程数比root用户的要少。当您使用新的Linux时,对于普通用户来说,它有一个更大的最大值


我发现这个问题是因为“metrics-meter-tick-thread-1”线程给我带来了巨大的痛苦——一个(Cassandra)库正在一次又一次地创建这些线程,我有300个名为“metrics-meter-tick-thread-1”和“metrics-meter-tick-thread-2”的线程。

只有在导出maven安装时,这个选项才起作用。但是您可以从meCan获得upvote,您不可以将此设置添加到您自己的.profile/.bashrc或其他内容吗?实际上,由于您有一个私有Maven安装,直接修改
mvn
脚本可能会更方便。请注意,我觉得指定太多内存没有帮助,尽管我看不出原因。谢谢Nicola,但我以前尝试过此设置,现在再试一次,运气不好。顺便说一句,这台机器有12GB的RAM,但仍然有6GB的空闲空间,正如free-mI最初认为我可能会达到一些地址空间限制,但后来我发现我可以在同一台机器上以root用户身份运行,并且可以在ubuntu上运行。一个谜。。。