프로그래밍

형님들 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
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
5683 [프로그래밍] 그 혹시 게임쪽 종사자 있음? 17 god79ii 0 2 일 전 534
5682 [프로그래밍] 코린이 ㅅㅂ 뭐가 문젠지 모르겠어요 7 집에가게해줘 0 2 일 전 362
5681 [프로그래밍] Dear Imgui 라고 아시나요? 2 년째모쏠 0 3 일 전 203
5680 [프로그래밍] 현업개발자분들 주말엔 편하게 쉴수있나요? 10 키로 0 3 일 전 748
5679 [프로그래밍] 무엇이든 물어보세요. 28 변현제 0 5 일 전 358
5678 [프로그래밍] 개발자보단 엔지니어가 취업이 잘됨 5 iillillill 2 7 일 전 641
5677 [프로그래밍] 프론트엔드 개발자 연봉 1억 넘는 사람 있어? 13 잠적자 0 7 일 전 571
5676 [프로그래밍] Exiftool 이거 일본어 못 읽는데 13 부터시작하는이세... 0 8 일 전 218
5675 [프로그래밍] 반응형 웹페이지가 내가상상한거랑 좀 다르네 4 평택국 0 9 일 전 412
5674 [프로그래밍] 고졸 FE개발자 연봉, 상황에 조언좀.. 19 쾅꿍꿍 0 10 일 전 554
5673 [프로그래밍] 물경력들 보면 책임을 이해못하는것같음 5 mils 1 10 일 전 375
5672 [프로그래밍] GPT가 코딩 다해주네 3 겜신병자 0 11 일 전 704
5671 [프로그래밍] 크로스플랫폼의 욕심은 끝이없다 4 ye 0 13 일 전 374
5670 [프로그래밍] 월루중에 백준 풀어보고 있는데, 6 오뜨 0 14 일 전 652
5669 [프로그래밍] 같이 일했던 시니어급 개발자 아예 직무 바꿨네.. 15 흐린눈 2 16 일 전 675
5668 [프로그래밍] 안드로이드 스튜디오가 이상해요... 2 집에가게해줘 0 17 일 전 383
5667 [프로그래밍] 양심고백 5 너가전부옳아 0 18 일 전 374
5666 [프로그래밍] 멀티겜만드는거 첨인데 빡시네 4 아님나 0 18 일 전 417
5665 [프로그래밍] vscode에 이런 설정도 있나? 17 너가전부옳아 0 19 일 전 285
5664 [프로그래밍] 네트워크 관련 관련 질문드립니다 6 그러네요 0 21 일 전 209