- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 재능이의 돈버는 일기
- StresslessLife
- K_JIN2SM
- 소소한 일상
- My Life Style & Memory a Box
- Blog's generation
- 공감 스토리
- 취객의 프로그래밍 연구실
- Love Me
- Dream Archive
- 세상에 발자취를 남기다 by kongmingu
- hanglesoul
- 카마의 IT 초행길
- 느리게.
- 미친듯이 즐겨보자..
- Joo studio
- Gonna be insane
- 악 다 날아갔어!! 갇대밋! 왓더...
- xopowo05
- 맑은공기희망운동
- 엔지니어 독립운동
- 혁준 블로그
- Simple in Complex with Simple
- 무의식이 의식을 지배한다
드럼치는 프로그래머
[JNI/NDK] JNI Tutorial - Local and Global References 본문
[JNI/NDK] JNI Tutorial - Local and Global References
드럼치는한동이 2013. 6. 4. 11:07오늘은 JNI 중 Local Reference 와 Global Reference 에 대해 알아보겠습니다.
이 글은 http://java.sun.com/docs/books/jni/html/refs.html#27423 내용을 요약 정리한 내용입니다.
Local and Global References
JNI는 jobject, jclass, jstring, jarray 등을 지원을 하는데 그것들은 opaque reference 입니다. 그래서 이녀석들은 JNI 함수를 통해서 opaque reference 의 내용물들을 받아와야 합니다. 이 opaque reference 의 장점은 JVM 의 내부구현에 상관없이 native code 를 구현할 수 있다는 것입니다. 프로그래머는 JNI 가 지원하는 다음의 reference 종류와 그 특징들을 알고 있어야만 합니다.
- JNI는 local reference, global reference, weak global rference 라는 3가지 reference 를 제공합니다.
- local reference 는 native 함수 return시 자동으로 free 되고, global 과 weak global reference 는 프로그래머가 free 할때까지 reference 가 유지됩니다.
- local & global reference 는 reference 를 유지하여 해당 object가 GC 되는 것을 막습니다. 하지만 weak global reference는 reference 가 유지되어도 GC의 대상이 됩니다.
Local and Global References
Local References
return 후에 이 함수안에서 생성된 모든 local reference 는 free 됩니다. 그래서 static 으로 저장된 stringClass 의 reference 도 free 됩니다. 그래서 다시 사용하게 되면, memory corruption 또는 system crash 를 유발합니다.
Local reference 를 해지하는 방법은 2가지가 있습니다. 먼저 local reference 를 만든 함수가 return 을 하는 것이 있고, 두번째는 DeleteLocalRef 함수를 통해서 return 전에 reference 를 해지시켜주는 것입니다. return 전에 local reference 를 삭제해주는 것은 사용 후 바로 GC 대상이 되도록 하여 메모리 누수를 막기 위함입니다.
return value로 local reference 가 전달 되는 case는 JVM 에 전달되는 순간, 또는 native code 에서 사용이 끝나는 순간에 GC 대상이 됩니다.
Local reference 는 또한 그것을 만든 thread 에서만 유효합니다. 다른 thread 에서는 쓰일 수 없습니다. Local reference 를 global variable 에 저장하거나, 다른 thread 가 쓸 수 있도록 하는 것은 에러입니다.
Global References
Global reference 는 multiple thread 에서 사용될 수 있으며, 프로그래머에 의해서만 free 가 됩니다. Global reference 역시 해당 object를 GC 의 대상에서 벗어나게 합니다.
Local reference 를 생성하는 방법은 여러가지가 있지만, Global reference 를 만드는 방법은 하나밖에 없습니다. NewGlobalRef 함수 입니다. Global reference 를 사용하면 cache 의 역할을 할 수 있습니다.
여기서도 memory 할당 문제로 항상 NewGlobalRef 값이 NULL 이 아닌지 체크해야 합니다.
Weak Global References
Weak Global Reference 는 SDK 1.2 부터 등장했습니다. 이 WeekGlobalReference 는 NewGlobalWeakRef 함수를 통해서 생성되고 DeleteGlobalWeakRef 함수를 통해서 지울 수 있습니다. 이녀석은 일반적인 Global Reference 와 같이 다른 thread 또는 function 에서 자유롭게 쓰일 수 있습니다. 하지만 Global reference 와는 다르게 Weak global reference 는 GC 의 대상입니다. 위의 예제에서는 static 변수 cache 를 할 때 GlobalReference 를 쓰던 WeakGlobalReference 를 쓰던 상관이 없습니다. 왜냐하면 java.lang.String 은 system class 로서 절대 GC 대상이 되지 않기 때문입니다. Weak Reference 는 GC 가 되도 상관없는 caching 을 할 때 유용합니다. 일반 Weak 이긴 해도 Global 로 reference 하고 있으니 해당 target 이 GC 되기 전까지는 이 reference 도 살아 있습니다.
Comparing References
Reference 들이 있을 때, 그것들이 똑같은 녀석을 point out 하고 있는지를 체크하는 방법이 있습니다.
(*env)->IsSameObject( env, obj1, obj2 );
NULL reference 는 JVM 의 null object 를 point 합니다. object 가 NULL 인지 체크하려면 다음과 같이 합다.
(*env)->IsSameObject( env, obj, NULL ) 또는 obj == NULL
WeakGlobalReference 의 경우는 살짝 다릅니다. WeakGlobalReference 가 유효한지 보려면,
(*env)->IsSameObject( env, weakObj, NULL );
Freeing References
Freeing Local References
- 어디서 호출할지 모르는 utility function 의 경우는 DeleteLocalRef 를 통해서 바로 local reference 를 제거해주는 것이 좋습니다.
Managing Local References in Java 2 SDK Release 1.2
JVM 은 각각의 native method 가 16개의 local reference 를 만드는 것까지는 자동으로 허용합니다. 16개가 넘는 Local reference를 쓰고 싶을 때는 EnsureLocalCapcity 를 호출해서 그 갯수를 늘려주어야 합니다.
Freeing Global References
Rules for Managing References
- local reference 의 경우 16개를 넘기지 않는 것이 좋으며, GlobalReference & WeakGlobalReference 의 경우는 쓰지 않을 때 반드시 해제해야 합니다.
- native utility function 을 사용할 때에는 어떤 local reference 도 남겨서는 안된다는 사실을 반드시 인지해야 합니다. native utility function 은 어떤 context 에서 호출될지, 얼마나 자주 호출될지 알 수 없기 때문입니다.
이것을 막기 위해서는 (*env)->NewLocalRef( env, [GlobalReference] ); 를 통해 local reference를 만들어 return 하는 것도 좋은 방법입니다.
'★─Programing > ☆─JNI | NDK' 카테고리의 다른 글
[JNI/NDK] NDK로 제작할 때 C와 C++의 차이 (0) | 2013.06.14 |
---|---|
[JNI/NDK] How to convert Arraylist in java to lpwstr in c using jni (0) | 2013.06.14 |
[JNI/NDK] JNI string type 다루는 법 (0) | 2013.06.04 |
[JNI/NDK] JNI Tutorial - Exceptions (0) | 2013.05.31 |
[JNI/NDK] JNI 사용시 메모리 관리 (0) | 2013.05.31 |