Arquillian 中的 OutOfMemoryError
OutOfMemoryError in Arquillian
我想使用 Arquillian 部署一个大约 70MB 的 EAR,但无论我做什么,我得到:
Exception in thread "management-client-thread 1-1" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
at org.jboss.as.protocol.StreamUtils.copyStream(StreamUtils.java:52)
at org.jboss.as.controller.client.impl.InputStreamEntry$InMemoryEntry.initialize(InputStreamEntry.java:76)
at org.jboss.as.controller.client.impl.AbstractModelControllerClient$ReadAttachmentInputStreamRequestHandler.execute(AbstractModelControllerClient.java:193)
at org.jboss.as.protocol.mgmt.AbstractMessageHandler.doExecute(AbstractMessageHandler.java:283)
at org.jboss.as.protocol.mgmt.AbstractMessageHandler$AsyncTaskRunner.run(AbstractMessageHandler.java:504)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
我试过了:
EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class);
ear.addAsModules(Maven.resolver().loadPomFromFile("pom.xml")
.resolve("org.acme:module1:war:?","org.acme:module2","org.acme:module3:war:?")
.withoutTransitivity().asFile());
然后
EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class);
ear.addAsModules(new File("lib/module1-4.4.2.war"));
ear.addAsModules(new File("lib/module2-3.7.0.jar"));
ear.addAsModules(new File("lib/module3-3.7.war"));
然后
EnterpriseArchive ear = ShrinkWrap.createFromZipFile(EnterpriseArchive.class, new File(
"../org.acme.project.ear/target/org.acme.project.ear.ear"));
连 Google 都不知道 (java.lang.UnsupportedOperationException: Multiple WebArchives found in org.acme.project.ear. Can not determine which to enrich
) 的异常,所以我补充说:
ear.delete("/module1-4.4.2.war");
// AND / OR
ear.delete("/module3-3.7.war");
哪个(取决于我删除的模块)将我带回到 OutOfMemoryError
或异常,因为当然现在的 application.xml EAR 不适用于新模块列表(并且由于 application.xml 是由 Maven 动态创建的,现在我可以将修改后的文件放入我的 Arquillian 测试工具中) .
然后我在 arquillian.xml
:
中修改了 Xms
和 Xmx
属性
<container qualifier="jboss" default="true">
<configuration>
<property name="javaVmArguments">-Xms512m -Xmx1024m</property>
</configuration>
</container>
问题的症结似乎是这个50MB WAR,我觉得没有那么大,但显然是。我该怎么做才能让我的 EAR 正常工作?
关于错误 java.lang.UnsupportedOperationException: Multiple WebArchives found in org.acme.project.ear. Can not determine which to enrich
:
Arquillian 必须向部署中添加一些库(使用 @Deployment(testable = false)
时除外)。
- 如果 ear 不包含任何 Web 模块,它将添加一个包含所需库的新
test.war
并将从此上下文触发测试(如果使用 servlet 协议)。
- 如果 ear 只包含一个 Web 模块,它将搭载这个并将所需的资源添加到该模块,并在该单个 Web 模块的上下文中执行测试。
- 现在有了多个网络模块,Arquillian 不知道要使用哪个网络模块,也不会添加额外的模块。相反,在这种情况下,您必须将其中一个 Web 模块标记为
Testable
Web 模块。
要将 module1
标记为可测试存档,您可以这样做:
EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class);
ear.addAsModules(
org.jboss.arquillian.container.test.api.Testable.archiveToTest(
ShrinkWrap.createFromZipFile(WebArchive.class, new File("lib/module1-4.4.2.war"));
ear.addAsModules(new File("lib/module2-3.7.0.jar"));
ear.addAsModules(new File("lib/module3-3.7.war"));
注意:事实上,如果 OOM 不会首先发生,您也应该在其他情况下看到此错误。
关于 OOM 我认为您应该增加测试进程的堆大小,arquillian.xml
中配置的堆大小将定义 JBoss 服务器的堆大小。
但是 OOM 甚至在应用程序部署之前就已经发生了。
如果您使用 Maven,这可能对您有所帮助:
我想使用 Arquillian 部署一个大约 70MB 的 EAR,但无论我做什么,我得到:
Exception in thread "management-client-thread 1-1" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
at org.jboss.as.protocol.StreamUtils.copyStream(StreamUtils.java:52)
at org.jboss.as.controller.client.impl.InputStreamEntry$InMemoryEntry.initialize(InputStreamEntry.java:76)
at org.jboss.as.controller.client.impl.AbstractModelControllerClient$ReadAttachmentInputStreamRequestHandler.execute(AbstractModelControllerClient.java:193)
at org.jboss.as.protocol.mgmt.AbstractMessageHandler.doExecute(AbstractMessageHandler.java:283)
at org.jboss.as.protocol.mgmt.AbstractMessageHandler$AsyncTaskRunner.run(AbstractMessageHandler.java:504)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
我试过了:
EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class);
ear.addAsModules(Maven.resolver().loadPomFromFile("pom.xml")
.resolve("org.acme:module1:war:?","org.acme:module2","org.acme:module3:war:?")
.withoutTransitivity().asFile());
然后
EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class);
ear.addAsModules(new File("lib/module1-4.4.2.war"));
ear.addAsModules(new File("lib/module2-3.7.0.jar"));
ear.addAsModules(new File("lib/module3-3.7.war"));
然后
EnterpriseArchive ear = ShrinkWrap.createFromZipFile(EnterpriseArchive.class, new File(
"../org.acme.project.ear/target/org.acme.project.ear.ear"));
连 Google 都不知道 (java.lang.UnsupportedOperationException: Multiple WebArchives found in org.acme.project.ear. Can not determine which to enrich
) 的异常,所以我补充说:
ear.delete("/module1-4.4.2.war");
// AND / OR
ear.delete("/module3-3.7.war");
哪个(取决于我删除的模块)将我带回到 OutOfMemoryError
或异常,因为当然现在的 application.xml EAR 不适用于新模块列表(并且由于 application.xml 是由 Maven 动态创建的,现在我可以将修改后的文件放入我的 Arquillian 测试工具中) .
然后我在 arquillian.xml
:
Xms
和 Xmx
属性
<container qualifier="jboss" default="true">
<configuration>
<property name="javaVmArguments">-Xms512m -Xmx1024m</property>
</configuration>
</container>
问题的症结似乎是这个50MB WAR,我觉得没有那么大,但显然是。我该怎么做才能让我的 EAR 正常工作?
关于错误 java.lang.UnsupportedOperationException: Multiple WebArchives found in org.acme.project.ear. Can not determine which to enrich
:
Arquillian 必须向部署中添加一些库(使用 @Deployment(testable = false)
时除外)。
- 如果 ear 不包含任何 Web 模块,它将添加一个包含所需库的新
test.war
并将从此上下文触发测试(如果使用 servlet 协议)。 - 如果 ear 只包含一个 Web 模块,它将搭载这个并将所需的资源添加到该模块,并在该单个 Web 模块的上下文中执行测试。
- 现在有了多个网络模块,Arquillian 不知道要使用哪个网络模块,也不会添加额外的模块。相反,在这种情况下,您必须将其中一个 Web 模块标记为
Testable
Web 模块。
要将 module1
标记为可测试存档,您可以这样做:
EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class);
ear.addAsModules(
org.jboss.arquillian.container.test.api.Testable.archiveToTest(
ShrinkWrap.createFromZipFile(WebArchive.class, new File("lib/module1-4.4.2.war"));
ear.addAsModules(new File("lib/module2-3.7.0.jar"));
ear.addAsModules(new File("lib/module3-3.7.war"));
注意:事实上,如果 OOM 不会首先发生,您也应该在其他情况下看到此错误。
关于 OOM 我认为您应该增加测试进程的堆大小,arquillian.xml
中配置的堆大小将定义 JBoss 服务器的堆大小。
但是 OOM 甚至在应用程序部署之前就已经发生了。
如果您使用 Maven,这可能对您有所帮助: