2011-09-20 4 views
1

내 응용 프로그램 위한 플레이 프레임 워크를 사용하고 내 application.conf에서 나는 모든 고객과 고객 각각에 대해 실행하는 기능을 가지고 있는 InvocationTargetException가 발생했습니다 : 널 (null) 플레이 프레임 워크에

jvm.memory=-Xmx512M -Xms512M -XX:-UseGCOverheadLimit 

을 준 microapp 이 함수는 해당 고객 및 DB에서 해당 마이크로 응용 프로그램에 대한 레코드를 리턴합니다.

모든 고객에 대해 실행하면 16 번째 고객에 대해 InvocationTargetException이 발생합니다 (15 명의 고객이 성공적으로 실행했습니다). 내가 그 고객과 뭔가 오류가 발견

12:38:30,153 ERROR ~ 


Execution exception 
InvocationTargetException occured : null 

play.exceptions.JavaExecutionException 
     at play.mvc.ActionInvoker.invoke(ActionInvoker.java:230) 
     at Invocation.HTTP Request(Play!) 
Caused by: java.lang.reflect.InvocationTargetException 
     at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:543) 
     at play.mvc.ActionInvoker.invoke(ActionInvoker.java:499) 
     at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:475) 
     at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:470) 
     at play.mvc.ActionInvoker.invoke(ActionInvoker.java:158) 
     ... 1 more 
Caused by: java.lang.OutOfMemoryError: Java heap space 
     at java.util.Arrays.copyOf(Unknown Source) 
     at java.lang.StringValue.from(Unknown Source) 
     at java.lang.String.<init>(Unknown Source) 
     at com.mysql.jdbc.SingleByteCharsetConverter.toString(SingleByteCharsetConverter.java:327) 
     at com.mysql.jdbc.ResultSetRow.getString(ResultSetRow.java:787) 
     at com.mysql.jdbc.BufferRow.getString(BufferRow.java:539) 
     at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5571) 
     at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5448) 
     at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5488) 
     at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:61) 
     at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64) 
     at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253) 
     at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249) 
     at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:229) 
     at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:330) 
     at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2283) 
     at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1527) 
     at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1455) 
     at org.hibernate.loader.Loader.getRow(Loader.java:1355) 
     at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:611) 
     at org.hibernate.loader.Loader.doQuery(Loader.java:829) 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 

오류입니다. 그래서 나는 혼자 그 고객을 위해 달린다. 나는 받고있다

Exception in thread "Timer-0" java.lang.OutOfMemoryError: Java heap space 
     at java.util.jar.Manifest.read(Unknown Source) 
     at java.util.jar.Manifest.<init>(Unknown Source) 
     at java.util.jar.JarFile.getManifestFromReference(Unknown Source) 
     at java.util.jar.JarFile.getManifest(Unknown Source) 
     at sun.misc.URLClassPath$JarLoader$2.getManifest(Unknown Source) 
     at java.net.URLClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.access$000(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector.run(ThreadPoolAsynchronousRunner.java:633) 
     at java.util.TimerThread.mainLoop(Unknown Source) 
     at java.util.TimerThread.run(Unknown Source) 
Exception in thread "pool-2-thread-1" java.lang.OutOfMemoryError: Java heap space 


For this microapp(Error occuring) alone i have 421,251 records 

오류의 원인이 될 수있는 것은 무엇입니까? 도와주세요.

+0

장기 실행 작업으로 인해 교착 상태가 발생합니까? – basav

+0

@basav 네, 마침내 전체 시스템을 끊습니다. 그래서 jvm.memory = -Xmx1096M -Xms1096M -XX로 jvm config를 늘 렸습니다 : -UseGCOverheadLimit 그 후에는 내 컴퓨터를 다시 시작했습니다. 다른 고객 (56 번째 고객)에게 다시 동일한 오류가 발생했습니다. 프로세스가 시작되는 동안 오류 발생시 ram 사용량은 647.8MB 였고 사용량은 1.7GB 였으므로 램 용량은 2GB입니다. 나는 정말 거대한 데이터를 가지고있다. 터미널에서 힙 공간 예외를 끝내고 연속적으로 실행합니다 ..... – Arasu

+0

그런 다음 청크로 처리하고 필요한 수의 스레드 만 생성하거나 대기열 시스템을 사용해야합니다. – basav

답변

0

문제는 OutOfMemory 오류입니다. 당신이 그 이유로 램을 올리면 나중에 일어납니다.

코드 샘플을 제공하지 않았지만 하나의 쿼리로 클라이언트의 메모리에 너무 많은 데이터를로드하려고한다고 가정합니다. 421k 레코드를 보유하고 있다는 의견은 오해가 아닌 한이를 확인합니다.

모든 레코드를 검색하기 위해 find() (또는 select 또는 cal)를 수행하는 대신 배치 (100, 200)로 레코드를 검색하고 그런 식으로 처리하십시오.