JVM: 41개의 글
컴파일 과정 모니터링 JVM의 PrintCompilation 옵션을 활성화시켜서 컴파일 로그를 확인하자 그리고 컴파일 되어야 하는 코드가 예상대로 컴파일 되고 있는지 확인하자 -XX:+PrintCompilation ( default : false ) - 메서드나 루프가 컴파일될 때마다 컴파일된 대상에 대한 정보를 출력한다 컴파일 로그 형식 [timestamp compilation_id attributes (tiered_level) method_name size deopt] - timestamp : JVM 시작시간을 0으로 했을 때, 컴파일이 끝난 시간 - attributes : 컴파일되고 있는 코드의 상태를 기호로 나타낸다. 1) % : OSR 컴파일을 의미 2) s : 메소드가 동기화됨 3) ! : 메..
컴파일러와 인터프리터 인터프리터는 코드를 한줄 읽고 바로 결과를 출력한다. 같은 기능을 하는 코드가 다시 나와도 또 다시 해석하여 결과를 출력한다. 컴파일러는 한번만 소스코드를 컴파일하여 같은 기능을 하는 코드가 있으면 미리 컴파일된 결과를 이용하여 결과를 출력한다. 때문에 한 번만 실행될 코드라면 인터프리터가 더 빠르다. 하지만 많이 실행될 코드라면 컴파일을 하는 것이 좋다. JIT : Just In Time, 그때그때! 핫스팟 JVM의 핵심, 컴파일 방법중 하나 핫스팟이란, 가장 자주실행되는 영역을 의미한다. 가장 자주실행되는 영역만을 컴파일한다고 생각하면 된다. 핫스팟 JVM은 코드를 바로 컴파일하지 않는다. 먼저 인터프리터가 동작하여 코드를 실행한다. 일정시간 동안, 인터프리터가 코드를 해석하며 ..
펌 영역에서 OOME(Out Of Memory Error)가 발생하면 아래와 같이 로그가 남는다 펌( PERM : Permanent Generation) 영역은 객체의 생명주기가 영구적일 것으로 생각하는 객체들을 관리한다. 이 영역은 GC대상에서 제외된다. 주로 자바의 Class 객체들이나 문자열에 속한 String 객체들이 위치한다. Class 객체들은, 시스템의 Classpath에 잡힌 객체들 또는 사용자에 의해 다이나믹하게 로드되는 클래스들이 있다. Spring같은 프레임워크들은 다이나믹하게 사용자가 정의한 클래스 정보를 로드한다. 주로 이 때 다이나믹하게 로드되는 클래스들에 의해 PERM영역의 OOME가 발생한다. 어떤 클래스 정보를 로드할 때, 해당 클래스의 정보만 로드하는 것이 아니라, 클래스..
CPU 사용률 $ top // 명령을 이용하면 CPU사용률을 볼 수 있다. 아래와 같이 bash가 75.2%의 CPU를 사용하는데 괜찮은 것일까? 가끔 컴퓨터가 버벅거릴때, CPU사용률을 보면 100%가 되는것들이 있다. 그때문에 CPU사용률이 100%가되면 문제가 있는것이라고 생각할 수 있는데, 그렇지 않다. CPU사용률은 특정 시간에 대한 평균값이다. 스레드마다 실행되는 시간이 정해져있고, 시간을 다 소모하게되면 다른 스레드가 돌고, 자기차례가 다시 돌아올때까지 유휴기간을 갖는다. 자신이 CPU사용시간을 받았을때, 사용시간 동안 CPU 를 사용한 퍼센트이기 때문에 높을수록 좋다. 따라서 CPU에 관해서, 성능을 높히기 위한 방법은 짧은 시간 동안 CPU 사용률을 가능한 높히는 것 CPU 사용시간은 두..
Heap 힙! 동적으로 할당되어 사용할 수 있는 메모리 영역 주로 실행중에 생성되는 객체들이 저장되고, 실행 후 제거되는 영역 GC(Garbage Collection)의 대상의 되는 메모리 영역 가비지 컬렉터는 가비지 컬렉션을 통해 힙 영역에 있는 사용되지 않는(더이상 참조가 없는) 객체를 회수한다. Memory Leak 메모리 누수! 힙 영역에 있는 동적으로 할당된 객체가, 더이상 사용되지 않음에도 불구하고 가비지 컬렉터에 의해 회수되지 않고 메모리에 남아있어서 자리만 차지하는 현상 메모리 누수가 쌓이면 메모리가 부족하게되서 결과적으로 OutOfMemoryError 가 발생한다 가비지 컬렉터는 메모리 누수인지도 모르고, 메모리가 부족하니까 계속 메모리를 회수하려고 가비지 컬렉션을 지속적으로 발생시킨다...
● GC (Garbage Collection) Java Application에서 사용하지 않는 메모리를 자동으로 수거하는 기능 C언어의 경우 malloc, free등을 이용해서 메모리를 할당하고, 일일이 그 메모리를 수거해줘야했다. 그러나 Java 언어에서는 GC가 알아서 해준다. ● Stop-the-world GC를 실행하기 위해 JVM이 어플리케이션의 실행을 멈춘다. 이를 Stop-the-world라고 한다. GC 튜닝이란, 이 Stop-the-world의 시간을 줄이는 것이다. ● Generational GCs 대부분의 객체는 오랜시간동안 살아있지 않는다. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다. 이러한 두 가지에 조건하에 가비지 컬렉터를 효율적으로 동작시키기 위해 HotSpot ..
JVM에는 여러 종류가 있다. JVM Specification에 JVM의 기능을 명세한다. JVM Specification을 구현한 여러 JVM이 존재하게된다. 명세서는 구글에 검색하면 언제든지 볼 수 있다. JVM 명세서를 구현한 대표적인 JVM으로 Hotspot과 JRockit이 있다. 두 개로 나뉜 이유는 간단히 각각 특화된 부분이 다르기 때문이다. Hotspot은 클라이언트 용 어플리케이션에 특화되었다. 반면에 JRockit은 서버용 프로세스에 특화되었다. JRockit은 Oracle Weblogic Server의 디폴트 JVM이고, Hotspot은 Java JDK/JRE의 디폴트 JVM이다. 메모리 구조 또한 다르다. 여기서는 그냥 이런게 있구나~하고 넘어가자. 나중에 알게된다. Hotspot ..
이번 포스팅에서는 코틀린의 타입 시스템에 대해 다루어볼 것이며, 주로 코틀린에서 Null을 다루는 방법을 주로 다루어볼 것이다. 널 가능성 널 가능성은 NPE 오류를 피할 수 있게 돕기 위한 코틀린 타입 시스템의 특성이다. 자바 객체는 기본적으로 null을 허용하고, null로 받은 객체 이지만, 해당 객체의 모든 메서드를 호출할 수 있게 설계 되었기 때문에, 런타입에 NPE가 많이 발생한다. 하지만 코틀린은 null 문제를 런타임 시점이 아니라 컴파일 시점으로 옮김으로써, 컴파일 시점에 실행 시점에 발생할 수 있는 여러가지 문제의 가능성을 줄여준다. 널이 될 수 있는 타입 코틀린과 자바의 가장 중요한 차이는 코틀린 타입 시스템은 널이 될 수 있는 타입을 명시적으로 지원한다는 것이다. 여기서 널이 될 수..
오늘 다루어볼 내용은 코틀린의 with와 apply 함수이다. 바로 예제로 들어간다. with 함수 fun alphabet(): String { val result = StringBuilder() for (letter in 'A'..'Z') { result.append(letter) } result.append("\nNow I Know the alphabet!") return result.toString() } 위 코드는 알파벳을 출력해주는 함수이다. 뭔가 StringBuilder를 생성하여 특정 변수에 담고, 해당 변수를 사용해 함수를 호출하고 뭔가 군더더기가 많이 붙어있는 느낌이다. 해당 코드를 with 함수를 통해 리팩토링이 가능하다. fun alphabet() = with(StringBuilder..
이전까지 간단하게 코틀린에 대한 간략한 문법들을 다루어봤는데, 이번 포스팅은 코틀린의 클래스, 객체, 인터페이스에 대해 다루어본다. 인터페이스 자바의 인터페이스와 크게 다르지 않다. interface SampleInterface1 { val property: String fun method1() fun method3() = println("method2") } interface SampleInterface2 { fun method2() fun method3() = println("method2") } class SampleImpl(): SampleInterface1, SampleInterface2 { override val property: String get() = TODO("Not yet implem..