본문 바로가기

Java, Kotlin, Spring111

JIT, AOT Compiler JIT, AOT Compiler 자바는 컴파일을 하면, .java 코드가 바이트코드 (.class) 로 변환된다. 변환된 바이트코드들을 실행가능한 파일로 모아둔 것이 .jar 파일이다. java -jar 명령어를 통해 위 jar 파일을 실행시키면 (Java Runtime Enviornment 에 적재) 런타임에서는 JIT 컴파일러를 통해 기계어 (Native code) 로 변환된다. 자바는 절반은 바이트코드로 컴파일하고, 절반은 런타임에서 바이트코드를 해석하는 인터프리터 방식을 사용한다고 할 수 있다. (C/C++, Go, Rust 는 컴파일 단계에서 소스코드를 바로 모두 기계어로 바꾸어 준다. 대신 빌드 환경의 CPU 아키텍처 환경에 종속적이므로, 다른 아키텍처에서 실행하기위해서는 빌드를 다시해야하는 .. 2023. 3. 22.
자바 애플리케이션 모니터링, javaagent, bytecode instrumentation 자바 애플리케이션 모니터링 JavaAgent, Bytecode Instrumentation 애플리케이션 운영시 모니터링이 필요하다. 애플리케이션 모니터링 서비스로 Datadog, Newrelic, Pinpoint 등이 있다. 위와 같은 자바에 모니터링 서비스를 연동할 때는 주로 자바의 javaagent 를 사용한다. javaagent 는 무엇인지 알아보자. JavaAgent JVM 에서 동작하는 자바 애플리케이션. JVM 의 다양한 이벤트를 전달받거나 정보 조회, 바이트코드 제어 등을 API 를 통하여 수행할 수 있다. -javaagent:[=] JVM 의 실행 가능한 최초 진입점인 main 메소드를 가로챌 수 있다. 실행시간에 동적으로 bytecode 를 조작할 수 있다. JVM 과 동일한 Class .. 2023. 3. 20.
자바 힙메모리 확인, heap dump Heap Dump 애플리케이션에서 메모리 과다 사용 문제 비정상적으로 힙메모리를 사용하고 있는 부분을 찾아 버그를 수정해야함. 힙메모리를 과다사용하면, GC 가 자주 발생해 애플리케이션 성능 저하가 되거나 OOM 으로 애플리케이션이 중단될 수 있다. java.lang.OutOfMemoryError: Java heap space at ... Full GC 를 해도, 메모리가 큰 변화없다면 메모리 누수(memory leak) 가 발생하는 것이므로 힙 메모리 확인 필요하다. Heap 사용량 증가 원인 원인은 여러가지가 있겠지만 보통 개발자 코드가 의도하지 않은대로 작동해서 발생한 버그일 경우가 높다. 혹은 많은 트래픽이 몰려와 평소보다 많은 힙 영역을 차지할 가능성도 있다. 애플리케이션 모니터링 GUI Vis.. 2023. 3. 19.
Garbage Collection GC (Garbage Collection) 가비지 콜렉션은 자바가 메모리를 관리하는 기법이다. 애플리케이션에서 동적으로 할당했던 메모리 (Heap 메모리) 중 사용하지 않는 영역을 정리하는 역할을 한다. JVM 에서 GC 의 스케쥴링을 담당한다. GC 가설 (weak generational hypothesis) "대부분 객체는 빨리 수명을 다한다." 따라서 젊은 세대, 늙은 세대를 나누어 객체의 수명을 관리를 한다. 젊은 세대 중 미사용 객체는 힙 영역에서 삭제 늙은 세대 중 미사용 객체는 모았다가 한꺼번에 삭제 GC 알고리즘 Garbage 대상을 식별하고, 힙 메모리에서 제거한다. 1) Reference Counting Algorithm 각 객체마다 참조 개수 (reference count) 를 관리하.. 2023. 3. 19.
Spring Data MongoDB - Criteria already contains 문제 Spring Data MongoDB - Criteria already contains 문제 MongoRepository 에서 바로 아래와 같은 인터페이스를 만들고 사용하면, 아래와 같은 예외가 발생합니다. public interface TodoRepository extends MongoRepository { List findAllByCreatedAtGreaterThanEqualAndCreatedAtLessThanEqual(LocalDateTime startAt, LocalDateTime endAt); }startAt 2023. 3. 11.
자바개발자가 보기에 Kotlin 에서 좋아보이는 것들 - 5 자바개발자가 보기에 Kotlin 에서 좋아보이는 것들 - 5 비동기 프로그래밍 기술 (Asynchronous Prgramming Techniques) 블로킹은 사용자들을 기다리게 만들고, 애플리케이션을 확장하는데 병목 현상을 초래한다. 애플리케이션에서 블로킹을 어떻게 막을 것인지 여러 방법이 있다. 쓰레딩 Threading 블로킹을 막기 위한 가장 잘 알려진 방법. 한 메인 프로그램에서 여러 쓰레드가 실행되며 동시 처리한다. fun postItem(item: Item) { val token = preparePost() val post = submitPost(token, item) processPost(post) } fun preparePost(): Token { // 요청을 보내 토큰을 받음 return.. 2022. 11. 12.
자바개발자가 보기에 Kotlin 에서 좋아보이는 것들 - 4 자바개발자가 보기에 Kotlin 에서 좋아보이는 것들 - 4 함수 (Functions) 기본값, 이름있는 아규먼트 (Default, Named arguements) 파라미터가 기본 값을 가지도록 할 수 있다. (default arguments) 이름있는 아규먼트 (named arguments)를 사용하여, 함수를 호출할 때 어떤 파라미터에 어떤 값을 넣는지 명시할 수 있다. 파라미터가 여러 개 있을 때 특히 유용하다. varargs 여러 아규먼트를 한나의 변수에 받아올 수 있다. variable number of arguments 라 한다. fun sum(vararg nums: Int) : Int { var result = 0 for (num in nums) { result += num } return .. 2022. 11. 7.
자바개발자가 보기에 Kotlin 에서 좋아보이는 것들 - 3 자바개발자가 보기에 Kotlin 에서 좋아보이는 것들 - 3 클래스와 객체에서 제네릭(Generics: in, out, where) 여기서는 공변, 반공변에 대한 개념이 조금 필요하다. 혹시 간단하게 알고싶다면 공변, 반공변이란 무엇일까 를 참고해보면 좋을 것 같다. 선언위치 변성 (Declaration-site variance) interface Factory { fun pop(): T fun push(t: T) // compile error } Factory 라는 클래스는 제네릭 파라미터 T 에 대해 공변(covariant) 임을 의미한다. Factory 클래스는 T 의 producer 만 가능하다고 생각할 수 있다. consumer 는 될 수 없다. 따라서 메소드 파라미터로 타입이 T 인 변수를 받.. 2022. 11. 3.
공변, 반공변이란 무엇일까 공변, 반공변이란 무엇일까 변성(Variance) 자바 제네릭은 기본적으로 불변 String 은 Object 의 서브타입이다. 하지만, List 은 List 의 서브타입이 아니다. 즉 자바의 제네릭 타입은 불변(invariant) 이다. 변성(variance)이 없다. 불변임으로 인해서 나타나는 아래 문제점을 보자. 뭔가 이상한 addAll 코드 class Collection { void addAll(Collection items) { for (E e: src) { push(e); } } } void copyAll(Collection to, Collection from) { to.addAll(from); // compile error } copyAll메소드는 컴파일에러가 발생한다. 사실 copyAll 메.. 2022. 10. 27.
자바개발자가 보기에 Kotlin 에서 좋아보이는 것들 - 2 자바개발자가 보기에 Kotlin 에서 좋아보이는 것들 - 2 이 글은 이전에 작성했던 자바개발자가 보기에 Kotlin 에서 좋아보이는 것들 - 1 에 이어서 연재됩니다. 클래스와 오브젝트(Classes and objects) 안에서 클래스(Classes) Trailing comma data class Todo( val id: Long, val title: String, val description: String, ) 맨 밑에 작성된 프로퍼티 맨 끝에도 , 를 사용할 수 있어서 일관적으로 작성할 수 있다. trailing comma 가 없다면 새로운 프로퍼티를 추가할 때, 2줄을 수정해야 해야 한다. 반면에 trailing comma 가 있다면 한 줄만 수정해도 된다. 사소하지만 이 부분은 코드리뷰시 수정.. 2022. 10. 15.
728x90