프로그래밍

형님들 JNI 질문 있어요 [해결]

물리학 기반 네트워크 알고리즘을 연산하려고 하는데 안드로이드에서 그냥 구현 하니까 속도가 너무 느려요.

 

그래서 JNI 사용하니까 속도가 200밀리초 걸리던 연산이 16밀리초로 확 줄어들더라구요.

 

그런데 문제가 하나 발생했어요.

 

제가 C++ 함수에서 자바 오브젝트를 가져오기 위해 할당한 메모리를 가지고

 

반복문으로 들어가면 CallObjectMethod를 통해서 값을 재정의 하게 되는데요.

 

2000~3000번 정도 연산을 하면 Local Reference Table overflow error가 발생하더라구요.

 

그래서 스택오버플로우에 질문을 올렸더니 반복문 밖에서 할당한 레퍼런스를 반복문 내에서 사용할때

 

사이클이 끝나면 (레퍼런스의 사용이 끝나면) Delete Local Reference를 해주라고 하더라구요?

 

그리고 실제로 잘 동작하는 걸 확인했어요.

 

 

이 부분이 제가 이해가 안되는 부분이에요.

 

만약 1000이란 주소에 메모리 4바이트를 할당해서 계속 그부분만 사용했는데 overflow가 나는 부분이요.

 

그래서 이 로컬 레퍼런스라는 것이 자바 힙 메모리에 저장되는 것은 아닌것 같다고 추정하고 있어요.

 

JNI 동작 플로우를 구체적으로 설명해준 자료를 찾으려고 했는데 쉽지가 않네요...

 

이 Local Reference란 녀석의 정체가 뭔지 정보를 주시면 너무 감사할 것 같아요.

 

추정, 추측, 자료, 링크,  조언 모두 감사히 받겠습니다. 

 

# 참고로 글에서 말한 스택 오버플로우 글의 링크입니다. 

https://stackoverflow.com/questions/78178953/i-dont-know-how-to-solve-local-reference-table-overflow-error-in-android-jni 

 

 

혹시 같은 질문이 있는 사람이 있을까봐 제가 알아본 정보 적어보려고 합니다.

 

JNI method를 통해서 자바 객체를 가져오게 되면 C++ Local Reference와 mapping을 통해서 자바 객체를 간접적으로 사용하게 됩니다.

 

이때, 자바 객체의 주소를 Local Reference Table에서 관리하게 됩니다.

 

문제는 GC의 대상이 되지 않도록 하므로 수동으로 지워주지 않으면 지워지지 않는다는 겁니다.

 

언제까지? 함수가 리턴할때 까지.

 

예를 들어보겠습니다.

 

jobject* A = ( jobject *) malloc(4);

for(element: javaList) {

    A = env -> CallObjcetMethod(~)

}

 

위와 같은 코드를 실행시키면 Local Reference에 정보가 계속해서 축적되게 되는 것이죠.

(제 생각에는 pure function과 같은 알고리즘을 사용하고 있지 않나 싶습니다. 물론 추측입니다.)

 

이후 정도를 지나치면 오버플로우 에러를 뱉게 됩니다.

 

여기까지가 제가 알아본 정보였습니다.

 

 

2개의 댓글

2024.03.19

??? : java에서 Local Reference Table overflow error가 발생하는데 이유 설명해줘

claude3 : Local Reference Table overflow 에러는 Java Virtual Machine(JVM)에서 발생할 수 있는 에러입니다. 이 에러는 메서드 프레임 내에서 생성된 지역 변수 참조의 수가 JVM이 할당한 최대 한도를 초과할 때 발생합니다.

각 스레드마다 JVM은 메서드 호출 스택을 유지하고, 각 메서드 프레임에는 로컬 변수와 그 변수들의 참조를 저장하는 Local Reference Table이 존재합니다. 이 테이블의 크기는 제한되어 있습니다.

Local Reference Table overflow는 주로 다음과 같은 경우에 발생할 수 있습니다:

깊은 재귀 호출: 메서드가 자기 자신을 반복적으로 호출하면서 지역 변수의 참조가 누적되어 한도를 초과할 수 있습니다.

대량의 객체 생성: 메서드 내에서 대량의 객체를 생성하면 그 참조들이 Local Reference Table을 가득 채울 수 있습니다.

확장 변수 사용: 클래스나 인스턴스 변수를 지나치게 많이 사용하면 메서드 프레임의 Local Reference Table 공간을 소모할 수 있습니다.

이 문제를 해결하기 위해서는 코드를 리팩토링하여 불필요한 객체 생성이나 변수 사용을 줄이고, 재귀 호출 대신 반복문을 사용하는 등의 방법을 고려해볼 수 있습니다. 또한 JVM 옵션을 조정하여 Local Reference Table의 크기를 늘리는 것도 가능하지만, 근본적인 원인을 해결하는 것이 좋습니다.

0
2024.03.19

???:아래 소스가 문제있는 소스의 일부분이야

에러가 안나도록 개선해줘

jobject* A = ( jobject *) malloc(4);

for(element: javaList) {

A = env -> CallObjcetMethod(~)

}

c:제공한 코드에서 몇 가지 문제점이 있습니다.

jobject* 포인터 배열을 동적으로 할당하는 대신, 벡터나 다른 동적 데이터 구조를 사용하는 것이 좋습니다.

각 반복문 실행 시마다 env->CallObjectMethod()를 호출하는 것은 비효율적일 수 있습니다.

메모리 누수 가능성이 있습니다.

아래는 개선된 코드입니다:

java

 

Copy code

std::vector<jobject> objects;

for (jobject element : javaList) {

jobject obj = env->NewGlobalRef(element);

objects.push_back(obj);

}

 

// 작업 수행

 

for (jobject obj : objects) {

env->DeleteGlobalRef(obj);

}

이 코드에서는 std::vector를 사용하여 jobject 인스턴스를 저장합니다. 각 반복문에서 env->NewGlobalRef()를 호출하여 전역 참조를 만들고, 이를 벡터에 추가합니다. 작업이 완료된 후에는 env->DeleteGlobalRef()를 호출하여 전역 참조를 해제합니다.

이렇게 하면 Local Reference Table 오버플로 문제를 피할 수 있습니다. 또한 메모리 누수 문제도 해결됩니다.

필요한 경우 env->PushLocalFrame()와 env->PopLocalFrame()을 사용하여 Local Reference Table 공간을 명시적으로 확보하고 해제할 수도 있습니다.

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180542 [컴퓨터] 이거 조립데탑 80정도에 팔면 노양심? 1 볶아먹어라굴단 0 1 시간 전 43
180541 [모바일] 폰 충전기 이거 대체 뭔 문제냐 2 맥스할로웨이 0 1 시간 전 35
180540 [견적] 컴고수 형님들 견적 한번 봐주실수있나요 ㅠ 4 입문문 0 5 시간 전 75
180539 [잡담] 이제 좀 내 783D좀 내놨으면 좋겠다 4 익명36 0 6 시간 전 179
180538 [컴퓨터] 저사양게임용 pc견적 이륙해도됨?? 1 푸피벗홀 0 7 시간 전 119
180537 [잡담] 가전은 lg 라던데 8 dlatnaks 0 7 시간 전 173
180536 [컴퓨터] 13900k 전력제한 240w로 쓰면 되냐? 9 ravvit 0 8 시간 전 117
180535 [컴퓨터] 컴사고 할게없다 3 판판야 0 9 시간 전 113
180534 [견적] 게임용 컴 견적 조언좀 부탁 8 우르선갈비찜 0 10 시간 전 109
180533 [모바일] 문외한인데 이정도 스펙이면 폰겜 잘 돌아갈까?? 16 삽살개 0 11 시간 전 148
180532 [견적] 50만원대 괜찮은 컴퓨터본체 추천좀 3 누지 0 11 시간 전 105
180531 [컴퓨터] i9 13900k 쓰고 있는데 철권 데모 끝까지 깼는데도 안튕기면 8 ravvit 0 12 시간 전 158
180530 [컴퓨터] 견적 뽑아봤는데 10 과연너의선택은무... 0 13 시간 전 130
180529 [잡담] 지금 애플워치6 사는건 어때? 4 EvenMoham 0 13 시간 전 130
180528 [잡담] 전자제품 전문 커뮤니티같은거없음? 2 인상펴라 0 13 시간 전 110
180527 [잡담] 컴퓨터 책상 추천좀요 6 하이웨이 0 14 시간 전 95
180526 [정보] 이번 인텔 13,14세대 CPU사태에 대한 공식입장 7 UBCS 3 15 시간 전 420
180525 [정보] G마켓에서 검색을 하면 검색이 안되고 그냥 메인페이지가 새... 5 r33156 0 16 시간 전 83
180524 [컴퓨터] 메인보드에 맞는 그래픽 카드 좀 추천해줘 12 갠챠나 0 17 시간 전 159
180523 [잡담] 개드립접속시 css 차단인가 광고차단 풀라고 하는데 8 스시오 0 17 시간 전 121