본문 바로가기

Java, Kotlin, Spring/Java7

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.
공변, 반공변이란 무엇일까 공변, 반공변이란 무엇일까 변성(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.
[Java] 패키지, import, 접근제어자 Java - Package 1 패키지 (Package) 자바에서 패키지는 관련된 클래스를 그룹화할 때 사용한다. 파일을 담는 폴더라고 생각하면 된다. 클래스 간 이름이 겹치는 것을 막고 유지하기 좋은 코드를 만들기 위해 패키지를 사용한다. 두 가지 패키지가 있다. 내장된 패키지 (Built-in packages) : Java API 로부터의 패키지 이다. Java API는 이미 쓰여진 클래스의 라이브러리이다. 자유롭게 사용가능하다. 사용자 정의 패키지 (User-defined package) 2 Import 임포트 키워드 자바 라이브러리는 패키지와 클래스로 나뉜다. import 키워드는 클래스나 패키지를 가져온다. import package.name.Class; // 하나의 클래스를 가져온다. impor.. 2021. 1. 6.
java - 상속, super, 오버라이딩, 추상클래스, final, Object 클래스 java 6 - 상속 백기선님의 https://github.com/whiteship/live-study 라이브 스터디 자바 공부입니다. 1 자바 상속의 특징 상속은 말 그대로 자식이 부모로부터 물려받는 것을 의미한다. 클래스 상속을 위해 extends 키워드를 사용한다. 자바에서 만드는 모든 클래스는 Object 클래스를 상속 받는다. 예제 Fruit.java public class Fruit { String name; public void setName(String name) { this.name = name; } } Apple.java public class Apple extends Fruit { } Apple 클래스에서 name 필드와 setName 메소드를 구현하지 않았지만, Fruit 클래스에서.. 2020. 12. 23.
728x90