2012-04-25 15 views
0

무엇이 잘못되었는지 알아내는 방법이나 팁을 찾고 있습니다.Linux 서버의 Java 메모리가 부족합니다.

참조를 보여주는 VisualVM 도구로 heapdumps를보고 있습니다. 내가 사용할 수있는 더 나은 도구가 있습니까? 이 참조를 해제하기 위해 명령 줄에서 실행할 수있는 것이 있습니까? jconsole GC를 사용하지 않으면 약 5 일 동안 만 지연 될 수 있습니다. 혼란 의 느린 축적을 고정하는 것은 정말 당신이 미세 조정하여 VM에 대해 생각할 수있는 도움이되지 않는 경우를 살펴에서이,

Apr 18, 2012 1:34:55 PM org.apache.jk.core.MsgContext action 
WARNING: Error sending end packet 
java.net.SocketException: Broken pipe 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
    at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:508) 
    at org.apache.jk.common.JkInputStream.endMessage(JkInputStream.java:112) 
    at org.apache.jk.core.MsgContext.action(MsgContext.java:293) 
    at org.apache.coyote.Response.action(Response.java:182) 
    at org.apache.coyote.Response.finish(Response.java:304) 
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:204) 
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282) 
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:744) 
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:674) 
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:866) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) 
    at java.lang.Thread.run(Thread.java:636) 
Apr 18, 2012 1:34:55 PM org.apache.jk.common.ChannelSocket processConnection 
WARNING: processCallbacks status 2 
java.lang.OutOfMemoryError: Java heap space 
Dumping heap to java_pid20051.hprof ... 
Heap dump file created [1147163590 bytes in 149.230 secs] 
Apr 18, 2012 1:59:14 PM ServerCommunicatorAdmin reqIncoming 
WARNING: The server has decided to close this client connection. 
Apr 18, 2012 1:59:14 PM ServerCommunicatorAdmin reqIncoming 
WARNING: The server has decided to close this client connection. 
+2

엄청난 양의 데이터 문자열을 보내지 않는 한, 문제는 시간이 지남에 따라 천천히 축적되는 것이지 특정 원인이 아니라고 생각됩니다. –

+0

이전에는 OutOfMemoryError 문제를 해결하기 위해 이클립스 메모리 분석기 도구를 사용했지만 제 경우에는 한 객체가 8GB SQL 결과 객체를 보유하고 있었기 때문에 발생했습니다. MAT를 사용하여 시도해 볼 수 있습니다. 문제가 Hot Licks의 설명 인 경우 실제 메모리 모니터링을 수행해야 할 수도 있습니다 (단지 메모리 사용량 증가). – birryree

+1

여전히 메모리 증가를 분석하고 성장이 어디에서 발생하는지 분석 할 수있는 프로파일 러가 필요합니다. 이런 상황에서 저의 경험에서 성장의 동기는 사실 한두 가지 근원에서 왔습니다. 그러나 여기에 해당 될 수도 있고 그렇지 않을 수도 있습니다. – ControlAltDel

답변

0

:

리눅스 서버는 모든 10~14일 다음 Java OOM을 얻는다 VM 인수 (실행 java -X). 어쩌면 이들 중 일부는 당신을 위해 재미있다 (하지만 OOM 예외없이 시간을 연장 할 수 있음) : -Xms 최대 Java 힙 크기
-Xss 설정 자바 스레드 스택을 설정 -Xmx 초기 Java 힙 크기
를 설정

크기
-Xprof 출력 CPU 프로파일 데이터

0

사용 -Xmx 최대 힙 사이즈를 설정하고, -Xss 스레드 스택 크기를 설정. 기억해야 할 중요한 점은 많은 스레드를 생성하는 경우 스레드 수를 최대화하기 위해 가능한 한 작은 스택 크기를 설정해야한다는 것입니다. 스레드를 만들려고 할 때 OOM 오류가 발생하고 스택에 충분한 공간이 없음). 그리고 힙이 클수록 쓰레드 스택을위한 공간이 줄어 듭니다. 따라서 힙과 스택간에 최적의 분할을 얻으려면 약간의 실험이 필요할 것입니다.

저는 1Gb의 메모리를 가진 Linux 서버를 사용하여 꽤 잘 관리해 왔습니다. (지금은 몇 년 전이지만 여전히 행복하게 일하고 있습니다) 힙은 256M이고 쓰레드는 64K입니다 (-Xmx256m -Xss64k). 또한 -XX : + HeapDumpOnOutOfMemoryError 플래그를 시도하고 JMX를 사용하여 Eclipse 메모리 분석기로 분석 할 수있는 .hprof 덤프를 가져와 메모리 누수가 있는지 확인해야합니다.

관련 문제