du.study기록공간

Ehcache에서 만난 warning 'The JVM is preventing Ehcache from accessing the subgraph beneath ~ cache sizes may be underestimated as a result' 본문

자바

Ehcache에서 만난 warning 'The JVM is preventing Ehcache from accessing the subgraph beneath ~ cache sizes may be underestimated as a result'

du.study 2023. 3. 28. 02:09
728x90

새로운 프로젝트를 실행하면서  로컬 캐시 라이브러리인 Ehcache 를 사용하는 일이 있었습니다.

 

기존에도 자주 사용하는 라이브러리 였기에 큰 걱정없이 사용했으나, 다음과 같은 에러가 갑자기 노출되기 시작했습니다.

 

The JVM is preventing Ehcache from accessing the subgraph beneath 'transient java.util.HashMap$Node[] java.util.HashMap.table' - cache sizes may be underestimated as a result

 

 

음.. 우선 원인이 되는 프로젝트의 코드를 찾아봅니다.

ehcache 내부의 ObjectGraphWalker 클래스에서 아래 코드에서 해당 에러를 뱉고있었습니다.

예시를 위해서 아래 테스트 코드를 통해서 캐시를 적용했고 실제 해당하는 에러는 아래와 같습니다.

    @Cacheable(cacheNames = {"캐시이름이였던것"}, key = "'캐시키였던것'")
    public Map<String, String> test(){
        return new HashMap<>(){{put("test","test");}};
    }
for(int var5 = 0; var5 < var4; ++var5) {
    Field field = var3[var5];
    if (!Modifier.isStatic(field.getModifiers()) && !field.getType().isPrimitive()) {
        try {
            field.setAccessible(true);
        } catch (SecurityException var8) {
            LOG.error("Security settings prevent Ehcache from accessing the subgraph beneath '{}' - cache sizes may be underestimated as a result", field, var8);
            continue;
        } catch (RuntimeException var9) {
            LOG.warn("The JVM is preventing Ehcache from accessing the subgraph beneath '{}' - cache sizes may be underestimated as a result", field, var9);
            continue;
        }

        fields.add(field);
    }
}

 

내부에서는 아래와 같은 메시지로 에러를 던지고 있었습니다.

Unable to make field transient java.util.HashMap$Node[] java.util.HashMap.table accessible: module java.base does not "opens java.util" to unnamed module @59662a0b

 

여기서 힌트를 얻은건 unnamed module! java 9에서 분명 이 비슷한 문구를 봤는데.. 관련 글을 찾아봅니다.

해답은 여기서 찾아볼 수 있었습니다 : https://openjdk.org/jeps/403

좀더 확신을 가지게 된 한글번역 : https://blogs.oracle.com/javakr/post/java-17-webcast-brief


java 17 버전부터 아래와 같은 부분이 명시적으로 변경되어있었고, 정확하게 에러가 발생하는 부분이 변경되었네요 

 

 

 

이걸 해결하려면 어떻게 해야할가 찾아봤고 아래의 설정을 통해 wanging이 더이상 노출되지 않는것을 확인할 수 있었습니다.

- Intellij 에서는 VM Options 에 아래 두출을 추가.

--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED

- 서버에서 java 명령어를 통해서 실행하는 부분에도 해당 구문 추가.

--add-opens=java.base/java.util=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \

이 부분을 통해서 더이상 warning이 노출되지 않는것을 확인할 수 있었습니다.

 

 

 

잠깐 그러면 진짜 이슈가 없나?????????  써도되나?? 저기는 대체 무슨동작을 하는걸까??를 확인해봤습니다.

위 경고가 뜨는 로직이 어디서 호출이 되나봤을때, 해당 캐시value의 size를 측정하는 부분에서 호출이 되고있습니다.

 

value가 되는 Object의 field들을 순회하면서 static이 아니고, primitive아 아닌 필드를 찾아서 size측정대상에 추가하는 로직이 돌아가는 상황이였습니다.

 

그리고 해당 사이즈를 통해서 캐시의 총 사이즈를 계산하고 있었고, 동작하는 형태였습니다.

 

이를 통해서 정리해보면

정말 이슈가없나?? : 코드를 봤을땐 해당 size자체가 작게 측정이 되게되면 실제 size보다 작은값으로 cache에 저장이 될것같은 구조라, 의도했던 값보다 더 큰 값이 cache에 적용되는 케이스가 발생할것같은 이슈가 있을것 같네요

써도되나?? : 실제 캐시동작은 정상 동작을 하고있고, 어떤 값을 캐시로 쓰냐에따라 매우 마음편하게 사용이 가능할것 같습니다.

 

728x90
Comments