Java/기타

· Java/기타
움직이는 객체 JVM을 공부해 본 사람이라면 GC가 일어나는 과정을 공부해 본 적이 있을 것이다. 가비지 컬렉터는 메모리를 여러 영역으로 나눠서 관리한다. 새롭게 생성된 객체는 Eden 영역에 할당되고, GC가 일어날 때까지 살아남은 객체들은 Survivor 영역으로 이동된다. 이렇게 몇 차례를 살아남은 객체들은 Old 영역으로 이동한다. GC 알고리즘에 따라 조금씩 다를 수 있지만 기본적인 원리는 그렇다. 어쨌든, 우리의 직관적인 생각과는 다르게 한 번 생성된 객체들은 메모리 상에서 가만히 있지 않고 끊임없이 움직인다. 이 말은 객체의 주소값이 계속 변한다는 것이고, 따라서 오래된 객체를 참조하면 segmentation fault가 발생하게 된다는 뜻인가? 물론 Java 개발자라면 이런 경우를 본 적이..
· Java/기타
Java Native Interface Java Native Interface는 이름 그대로 Java에서 Native Code를 실행할 수 있는 Interface를 제공한다. Native Code란 Java의 바이트코드처럼 어느 환경에서나 실행할 수 있는 코드가 아닌, 해당 환경에서만 실행할 수 있는 코드를 말한다. 간단히 C/C++ 코드를 컴파일한 어셈블리 코드를 생각하면 된다. python에서 TensorFlow를 사용해봤다면 익숙할 것이다. python은 인터프리터 언어로 실행 시간이 평균적으로 Java보다도 느리다. 따라서 python으로 모델 학습을 시킨다면 매우 느릴 것이다. 따라서 TensorFlow는 대부분을 C++로 구현해 python에서도 모델을 빠르게 학습시킬 수 있게 만들었다. 이렇..
· Java/기타
Native Image JVM을 공부하다가 JVM 없이도 Java 어플리케이션을 실행할 수 있다는 재밌는 사실을 발견했다. C언어를 컴파일하면 실행가능한 파일이 생성되는 것처럼, Java를 바이트코드가 아닌 실행가능한 파일로 컴파일할 수 있다는 뜻이다. 이러한 파일을 Native Image라고 한다. 이렇게 Native Image를 실행하면 JVM에서 실행하는 것이 아니기 때문에 시작 시간이 빠르며, 메모리를 아낄 수 있다고 한다. GraalVM Native Image를 만들기 위해서는 GraalVM이 필요하다. GraalVM은 기존에 C++로 작성된 JIT 컴파일러를 Java로 대체해 Java로 Java를 실행하는(meta-circular Java) 목표를 가지고 만든 JVM이다. 뿐만 아니라, 컴파일..
ready-go
'Java/기타' 카테고리의 글 목록