在阅读和处理大型XML文件时,我的JBOSS出了问题。
我的硬件:
-OS:Windows 2008 Server R2 Enterprise -CPU:Intel E7210 @ 2.4 Ghz(双核) -RAM:12 GB
我尝试读取大约370 MB的XML文件。 当我在JBOSS中的程序正在读取此文件时,内存使用量增加到大约5 GB。
但每次JBOSS在读取文件时崩溃并重新启动。 日志文件中没有提示,为什么JBOSS正在重启:
带有fromHdd.trf的部分是我开始阅读xml文件的部分(16:46:57,411) 两秒钟后(16:48:31,036),jboss正在重启而没有任何错误。
jboss日志的一部分:
2012-07-09 16:46:51,083 INFO [de.softproject.integration.engine.X4engine] Started process "iMan_WebConnect/Stammdaten/ERW16/AttributeSets/Process/getAttributeSetsFromCML.wrf".
2012-07-09 16:46:57,411 INFO [de.softproject.integration.engine.X4ModuleImpl] Executed action "fromHdd.tra" in 6.313 ms.
2012-07-09 16:48:31,036 INFO [com.arjuna.ats.jbossatx.jta.TransactionManagerService] JBossTS Transaction Service (JTA version) - JBoss Inc.
2012-07-09 16:48:31,036 INFO [com.arjuna.ats.jbossatx.jta.TransactionManagerService] Setting up property manager MBean and JMX layer
2012-07-09 16:48:31,645 INFO [com.arjuna.ats.jbossatx.jta.TransactionManagerService] Starting recovery manager
2012-07-09 16:48:31,755 INFO [com.arjuna.ats.jbossatx.jta.TransactionManagerService] Recovery manager started
2012-07-09 16:48:31,755 INFO [com.arjuna.ats.jbossatx.jta.TransactionManagerService] Binding TransactionManager JNDI Reference
2012-07-09 16:48:35,926 INFO [org.jboss.ejb3.EJB3Deployer] Starting java:comp multiplexer
我的猜测: Java程序使用saxon解析器。 Java或saxon解析器导致内存错误。
这部分来自文件wrapper.conf,我已经为Java配置了8GB RAM。
# Java Additional Parameters
wrapper.java.additional.1=-Dprogram.name=run.bat
wrapper.java.additional.2=-Dx4.config.file=../../X4config.xml
wrapper.java.additional.3=-Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl
wrapper.java.additional.4=-Xms128m
wrapper.java.additional.5=-Xmx8192m
wrapper.java.additional.6=-XX:MaxPermSize=256m
wrapper.java.additional.7=-server
wrapper.java.additional.8=-Dsun.rmi.dgc.client.gcInterval=3600000
wrapper.java.additional.9=-Dsun.rmi.dgc.server.gcInterval=3600000
wrapper.java.additional.10=-Djava.endorsed.dirs=../lib/endorsed
我该怎么办,以防止JBOSS反击。 希望你有一些想法。
最诚挚的问候 LStrike
PS:是的,我知道,我还没有发布任何代码。 我无法访问代码,这是来自HD.trf的功能背后的代码,所以我试着得到一些答案。
答案 0 :(得分:3)
此时,某种“内存不足”问题似乎是最可能的解释,但你真的需要一些证据:
您应该弄清楚如何从JBoss获取更多关于导致重启的信息。检查所有日志文件。如果没有任何相关内容,请更改日志记录设置以增加日志记录量。
您应该考虑JBoss JVM由于进程的“ulimit”资源限制或者由于“OOM杀手”的操作而被外部杀死的可能性。您希望在操作系统日志中有一些这些迹象。
你怎么能阻止这个?好吧,我唯一的建议是显而易见的。
增加JVM堆大小。 (但根据问题导致JBoss重启的方式,这可能会使事情变得更糟。)
限制输入的大小,或将其分成较小的块。
重写使用XSLT的部分以其他方式进行转换。 (Saxon不是解析器。它是一个XSLT引擎。)
切换到更高效的XSLT引擎。这个SO问题的接受答案(What is the Most Efficient Java-Based streaming XSLT Processor?)表示Saxon-SA在内存使用方面是最有效的。
答案 1 :(得分:0)
我将JVM的大小调整为最小4 GB,最大为10 GB。
我已经按如下方式配置了wrapper.conf:
# Java Additional Parameters
wrapper.java.additional.1=-Dprogram.name=run.bat
wrapper.java.additional.2=-Dx4.config.file=../../X4config.xml
wrapper.java.additional.3=-Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl
wrapper.java.additional.4=-Xms4096m
wrapper.java.additional.5=-Xmx10240m
wrapper.java.additional.6=-XX:MaxPermSize=2048m
wrapper.java.additional.7=-server
wrapper.java.additional.8=-Dsun.rmi.dgc.client.gcInterval=3600000
wrapper.java.additional.9=-Dsun.rmi.dgc.server.gcInterval=3600000
wrapper.java.additional.10=-Djava.endorsed.dirs=../lib/endorsed
wrapper.java.additional.11=-Dcom.sun.management.jmxremote.port=12233
wrapper.java.additional.12=-Dcom.sun.management.jmxremote.authenticate=false
wrapper.java.additional.13=-Dcom.sun.management.jmxremote.ssl=false
wrapper.java.additional.14=-Dcom.sun.management.jmxremote
wrapper.java.additional.15=-Djboss.platform.mbeanserver
wrapper.java.additional.16=-Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl
wrapper.java.additional.17=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait=120
#wrapper.java.additional.18=-Xss7048k
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=4096
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=10240
目前我正在处理一个440 MB的XML文件。 内存使用量稳定在8GB左右。
希望将来能够稳定运行。
谢谢你的帮助。