Arquillian中的OutOfMemoryError

时间:2016-01-04 11:39:11

标签: java jboss-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$1.execute(AbstractModelControllerClient.java:193)
at org.jboss.as.protocol.mgmt.AbstractMessageHandler$2$1.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"));

即使谷歌不知道(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,要么回到异常,因为当然现在EAR的 application.xml 不能用于新模块列表(并且由于 application.xml 是由Maven动态创建的,现在我可以将修改后的文件存入我的Arquillian测试工具中。)

在某条线上,我摆弄了Xms中的Xmxarquillian.xml属性:

<container qualifier="jboss" default="true">
    <configuration>
        <property name="javaVmArguments">-Xms512m -Xmx1024m</property>
    </configuration>
</container>

问题的关键似乎是这个50MB的WAR,我觉得不是那么大,但显然是这样。我能做些什么来让我的EAR工作?

1 个答案:

答案 0 :(得分:4)

关于错误 public abstract class ListViewRow<ModelType> extends FrameLayout { ModelType model; View childView; public ListViewRow(Activity context, int viewLayout) { super(context); LayoutInflater inflater = context.getLayoutInflater( ); childView = inflater.inflate( viewLayout, this, false ); addView(childView); } public abstract void setModel(ModelType newModel);}

Arquillian必须在部署中添加一些库(使用 public class AdapterRow extends ListViewRow<String> { TextView tv; ImageView iv; public AdapterRow(Activity context) { super(context, R.layout.li); tv = (TextView)findViewById(R.id.tv); iv = (ImageView)findViewById(R.id.iv); } public void setModel(String str){ tv.setText(str); iv.setImageResource(R.drawable.ic_launcher); }} 时除外)。

  • 如果一个ear不包含任何Web模块,它将添加一个包含所需libs的新java.lang.UnsupportedOperationException: Multiple WebArchives found in org.acme.project.ear. Can not determine which to enrich,并将从此上下文触发测试(如果使用了servlet协议)。
  • 如果耳朵只包含一个Web模块,它将搭载此模块,并将所需资源添加到此模块,并在此单个Web模块的上下文中执行测试。
  • 现在有了多个Web模块,Arquillian不知道要使用哪个Web模块,也不会添加其他模块。相反,在这种情况下,您必须将其中一个Web模块标记为@Deployment(testable = false) Web模块。

要将test.war标记为可测试档案,您可以这样做:

Testable

注意:事实上,如果首先不发生OOM,你应该在其他情况下看到这个错误。

关于OOM我认为你应该增加测试进程的堆大小,module1中配置的堆大小将定义JBoss服务器的堆大小。 但是,甚至在应用程序部署之前就会发生OOM。 如果您使用Maven,这可能对您有所帮助:https://stackoverflow.com/a/16969122/2779488