JVM

    JVM에서 Garbage Collection(GC) 이 일어나는 방식 알아보기

    JVM에서 Garbage Collection이 중요한 이유 JVM은 자동으로 메모리를 관리해주기 때문에 GC(Garbage Collection)가 성능상 매우 중요하다. 모든 머신들이 그렇듯 JVM 또한 사용되지 않는 객체들이 제때 메모리에서 정리되지 못하고 한 번에 정리되거나 한다면 앱이 버벅거리거나, 제대로 동작하지 않을 수 있다. 또한 만약 사용되지 않는 객체가 GC의 대상이 되지 못한다면 Out of Memory Error 로 인해 앱이 강제 종료될 수도 있다. 여기서 말하는 Memory는 Heap 영역이다. Stack 영역은 포인터만 저장하는 비교적으로 가벼운 저장 공간이기 때문에 성능 상 큰 이슈가 발생할 가능성이 적다. GC가 일어나는 방식과 Heap Memory JVM은 Heap 메모리 관..

    JVM의 Memory 할당 방식 : Stack과 Heap Memory가 동작하는 방법

    JVM의 메모리 할당 방식 JVM은 기본적으로 Stack Memory 와 Heap Memory 라 불리는 두가지 저장 공간을 이용해 메모리를 할당한다. 이들에 메모리를 할당하는 방법은 바이트 코드를 한 줄 한 줄 읽는 것이다. 한 줄 한 줄 읽혀진 값들은 JVM의 Stack 영역에 차곡차곡 메모리 할당 예제 예를 들어 다음과 같은 코드가 있다고 해보자. fun main() { val numberA = 12 val numberB = 15 val numberC = numberA + numberB } fun add(numberA: Int, numberB: Int): Int { return numberA + numberB } 위 코드에서 main function이 수행되면 다음과 같은 과정을 거쳐 메모리가 할당..

    JConsole을 활용한 Java Process Code Cache 모니터링

    JConsole이란? JConsole이란 실행중인 java process를 모니터링 하는 응용프로그램으로, jdk에 포함되어 나온다. 응용프로그램이어서 실행하면 바로 사용할 수 있다. 윈도우에서 사용하기 위해 필요한 사항 Mac은 기본으로 권한을 올려주지만, 윈도우에서 사용하기 위해서는 별도의 설정이 필요하다. 1. C:\Users/유저명/AppData/Local/Temp 폴더 에 접근한다. 2. hsperfdata_[유저명] 폴더를 찾아 오른쪽 클릭 후 속성 클릭 후 Security 클릭한 후 모든 유저 - 편집 을 누른다. 3. 아래의 Permission 탭에 모든 권한을 클릭한 후 OK를 누른다. JConsole 위치 mac과 window의 JConsole을 위치가 다르다. mac : /Users/..

    코드 캐시(Code Cache) 사이즈 조정을 통한 JVM 최적화

    코드 캐시 사이즈와 C2 컴파일러 앞선 글 에서 JVM은 성능 최적화를 위해 자주 사용되는 코드에 대해 C2 Compiler 을 사용하여 바이트 코드를 변환한 기계어를 캐시해놓고, 다음에 같은 코드가 실행되면 캐시에서 가져오는 방식으로 실행 시킨다고 하였다. *이러한 방식으로 컴파일을 수행하는 컴파일러가 바로 JIT 컴파일러이며, 캐시 해놓은 코드를 가져오는 것은 마치 미리 컴파일 해놓은 코드를 가져오는 방식과 비슷하게 되어 실행 속도가 비약적으로 빨라진다. JVM의 JIT(Just In Time Compilation) 컴파일이란? C1, C2 컴파일러를 이용한 최적화 JVM에서 코드를 실행하는 방법 JVM은 바이트 코드(Byte Code)라 불리는 기계어 코드를 실행하는 가상 머신이다. 우리가 Java..

    JVM의 JIT(Just In Time Compilation) 컴파일이란? C1, C2 컴파일러를 이용한 최적화

    JVM에서 코드를 실행하는 방법 JVM은 바이트 코드(Byte Code)라 불리는 기계어 코드를 실행하는 가상 머신이다. 우리가 Java나 Kotlin으로 코드를 작성하면 코드들은 컴파일 타임에 바이트 코드로 변환되며, 바이트 코드들은 런타임에 기계어로 변환되어 기계어가 JVM 상에서 실행된다. 이때 Java와 Kotlin 코드는 프로그램 실행 시점 전인 컴파일 타임에 바이트 코드로 변환이 모두 완료된다. 하지만, JVM에서 바이트 코드를 실행하기 위해서는 바이트 코드를 기계어로 변환하는 단계를 하나 더 거쳐야 한다. JVM 실행 초기에는 인터프리터에서 바이트 코드를 해석해 기계어를 실행하지만, 인터프리터만을 실행되는 바이트 코드는 성능이 좋지 않다. 때문에 JVM은 자주 실행되는 바이트 코드 실행의 최..