본문 바로가기
트러블슈팅/MW

[웹로직] AdminServer OutOfMemoryError: Metaspace

by sangyeon 2021. 4. 8.
728x90

#AdminServer

#OutOfMemoryError: Metaspace

#WLS 12.2.1.2.0

 

L사에서 웹로직 패치를 위해 채널포트를 OFF 하는 과정에서 AdminServer 프로세스가 다운되었다.

로그를 보니, Metasapce 영역의 OutOfMemoryError 발생으로 인한 이슈였고, 서버가 강제 종료되었다.

 

Metaspace가 OutOfMemory가 발생한 이유는 Java 클래스 메타 데이터가 Native Memory(Metaspace)영역에 할당되는데, 해당 메모리가 부족한 경우 발생한다.

 

#1. AdminServer 로그

####<2021. 4. 6, 5:32:31,598 오후 KST> <[ACTIVE] ExecuteThread: '156' for queue: 'weblogic.kernel.Default (self-tuning)'> <> <> <733693a6-5cc3-40b1-83bc-861c90a74e06-0002a5e2> <1617697951598> <[severity-value: 16] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > xxxxx26". Exception is: "java.io.IOException: [DeploymentService:290084]Data transfer between administration and managed server failed for resource "pending/config.xml".

> xxxxx26 서버에서 request id "88,991,757,154,950,177" 요청에 대한 배포 데이터 전송 메시지를 처리하는 동안 배포 서비스에서 예외가 발생했습니다. (AdminServer 거의 모든 Managed Server 사이에서 위와 같은 메시지가 발생함)


####<2021. 4. 6, 5:32:09,847 오후 KST> <[ACTIVE] ExecuteThread: '71' for queue: 'weblogic.kernel.Default (self-tuning)'> <> <> <733693a6-5cc3-40b1-83bc-861c90a74e06-0002a5d7> <1617697929847> <[severity-value: 16] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > xxxxx26". Exception is: "java.lang.OutOfMemoryError: Metaspace

-> WLS Admin Console에서 설정 변경 및 활성화 시에 변경이 적용되는 대상 Managed Server에 대해 Admin Server는 배포 데이터 메시지를 전송한다. 그 과정에서 Metaspace OOME가 발생하였다. (아마 여러 대의 인스턴스에 대하여 채널 포트를 모두 OFF 하는 과정에서 부하가 간 것으로 보임)

####<2021. 4. 6, 5:32:09,848 오후 KST> <[ACTIVE] ExecuteThread: '14' for queue: 'weblogic.kernel.Default (self-tuning)'> <> <> <733693a6-5cc3-40b1-83bc-861c90a74e06-0002a5db> <1617697929848> <[severity-value: 16] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] >
at sun.misc.Unsafe.defineClass(Native Method)
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)
at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:92)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:55)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:1006)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1997)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
at weblogic.deploy.service.internal.transport.http.DeploymentServiceServlet.handleDeploymentServiceMessage(DeploymentServiceServlet.java:951)
....(중략)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3679)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3649)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326)
at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197)
".>

-> OOME 발생 시 로그 스택을 보면 실제로 배포 데이터 메시지를 전송하는 과정에서 Native Method를 호출하여 Native Memory(Metaspace)를 사용한다.

그렇다면 웹로직 관리콘솔에서 설정 변경 작업시에 여러 대의 대상 서버들에 대한 변경 및 반영 작업 시 Native Memory를 과도하게 사용할 수 있기 때문에 Admin Server의 Metaspace 영역 메모리를 늘려야 한다.

 

늘리는 방법은 기동스크립트에 자바 옵션으로 -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m 늘리면 된다.

 

728x90