2017-02-16 1 views
1

우리 프로젝트에는 다음과 같은 코드가 있지만 잘 동작하지만 무작위로 클래스 정의 오류를 런타임에 찾을 수 없습니다. 매주 일요일마다 App 서버가 다시 시작되므로 임의의 서버 인스턴스에서이 오류가 발생하는 경우가 있습니다. 서버를 다시 시작하면 문제가 해결되지만 클래스 로딩이 중단되는 이유를 알 수 있습니다. Java 8 람다 - 런타임 오류

는이 질문에 다소 유사한 오류가 발생했습니다하고 문제가 JDK 9 Transforming lambdas in Java 8

에서 해결 된 것 같습니다하지만 누군가가 그것을 설명 할 수있는 결론을하기 전에 가끔 발생하는 이유 오류의 같은 종류이며.

public boolean isAttachmentExpired(final Document_Attachment da) { 
    return this.bcDocumentScreen.getValidator().getAttachmentsValidator().isAttachmentExpired(da); 
} 

public boolean isAttachmentWarningShown() { 
    return CollectionUtils.isNotEmpty(getAttachments()) && getAttachments().stream().anyMatch(this::isAttachmentExpired); 
} 

public boolean isAttachmentExpired(final Document_Attachment da) { 
     final Date today = DateHelper.today(); 
     return DateHelper.diffInYears(today, da.getUploaded()) >= 1; 
    } 

오류 : -

Caused by: java.lang.reflect.InvocationTargetException 
     at sun.reflect.GeneratedMethodAccessor1913.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) 
     at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56) 
     at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:79) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
     at org.jboss.seam.persistence.ManagedEntityInterceptor.aroundInvoke(ManagedEntityInterceptor.java:48) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
     at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
     at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
     at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107) 
     at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:196) 
     at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:114) 
     at com.XXX.BcdAttachmentsSection_$$_javassist_seam_91.isAttachmentWarningShown(BcdAttachmentsSection_$$_javassist_seam_91.java) 
     at sun.reflect.GeneratedMethodAccessor1912.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at javax.el.BeanELResolver.getValue(BeanELResolver.java:363) 
     at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
     at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
     at org.jboss.el.parser.AstPropertySuffix.getValue(AstPropertySuffix.java:53) 
     at org.jboss.el.parser.AstValue.getValue(AstValue.java:67) 
     at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) 
     at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) 
     ... 122 more 
Caused by: java.lang.NoClassDefFoundError: com/XXX/docsections/BcdAttachmentsSection$$Lambda$75 
     at com.XXX.BcdAttachmentsSection$$Lambda$75/1736532374.get$Lambda(Unknown Source) 
     at com.XXXX.isAttachmentWarningShown(BcdAttachmentsSection.java:51) 
     ... 150 more 
+0

종료하는 동안 이런 현상이 발생합니까? – teppic

+0

아니요, 사용자가 isAttachmentWarningShown 메소드가 호출되는 모듈에 액세스하려고 할 때마다 발생합니다. –

+2

Reflection 클래스와 익명 클래스 사이의이 비 호환성을 알고 있지만 jboss가 'Predicate'에서 Reflection을 통해 메소드를 호출하려고하는 이유를 알지 못합니다. . – Holger

답변

5

계측가 관련된 경우는, the bug, you have linked 적용 않는다는 것을 확실히 가능합니다. 기본 구현에서 HotSpot이 인라인 할 수있는 바이트 코드로 구성된 접근 자 클래스를 생성하여 후속 호출을 최적화하므로이 버그 (JDK-8027681, “Lambda serialization fails once reflection proxy generation kicks in”)가 16 회 이상 수행 된 모든 리플렉션 작업 (구성 가능한 임계 값)에 영향을 미쳤습니다. 이 바이트 코드는 초기 버전의 Java 8에서 람다 식에 대해 생성 된 익명 클래스에 액세스하지 못했습니다.

이 버그가 수정되었지만 특정 수의 호출 후에도 클래스가 생성되는 것으로 설명한 동작이므로 에이전트가 이러한 생성 된 클래스를 계측하기 위해서는 여전히 기존의 계측 버그로 인해 실패 할 수 있으며 호출 횟수에 대한 종속성이 종종 가끔 발생하는 이유 일 수 있습니다.

Instrumentation/JVM의 버그는 수정되어야하지만 (다음 릴리스에서 수정 될 예정 임) 이러한 클래스를 인스트루먼트하지 않는 데 도움이됩니다. 일반적으로 이러한 내부 헬퍼 클래스를 계측 할 이유가 없어야합니다.

+0

이 버그를 알려 주셔서 감사합니다. 그러나이 버그가 해결 된 jdk 1.8.0_111에 이미 있습니다. –

+0

또한 응용 프로그램이 weblogic에 배포되고 'jboss'를 참조하는 오류 추적은 실제로이 메서드가있는 클래스가 jboss seam 구성 요소이기 때문에 발생합니다. –

+1

좋습니다. 그렇기 때문에 어떤 계측을 적용하든 관련이 있습니다 ("jboss"또는 "jboss seam 구성 요소"여부는 중요하지 않습니다). 이 성명서는 여전히 성립 중이며,이 성찬이 무엇을 성취하려고하는지 명확하지 않습니다. – Holger