공부방/JAVA (24) 썸네일형 리스트형 Java의 동작 방식과 JVM의 구조 Java의 동작 방식과 JVM의 구조 Java Virtual Machine (JVM)은 Java 언어로 작성된 프로그램을 실행하는 가상 머신입니다. JVM은 Java 프로그램의 실행 환경을 제공하며, 운영 체제와 Java 프로그램 사이에서 중개자 역할을 수행합니다. JVM의 구조와 동작 원리를 이해하는 것은 Java 개발자에게 매우 중요한 요소이기 떄문에, Java의 동작 방식과 JVM의 구조에 대해서 한 번 살펴보도록 하겠습니다. 우선 javac라는 컴파일러를 이용하여 모든 .java 파일을 .class 파일로 컴파일 시킵니다. JVM은 바이트코드로 작성된 .class 파일을 이용하여 운영체제에 맞는 네이티브코드로 변환해줍니다. 간략히 살펴보면 아래와 같은 구조입니다. 클래스 로더 시스템 JVM은 클래.. [Java] 제네릭과 와일드카드 타입에 대해 쉽고 완벽하게 이해하기(공변과 불공변, 상한 타입과 하한 타입) [망나니 개발자] https://mangkyu.tistory.com/241 이번에는 공변과 불공변에 대해서 먼저 알아보고, 이후에 제네릭과 와일드카드에 대해 알아보도록 하겠습니다. 많은 분들이 어려워하는 제네릭인 만큼 쉽게 풀어서 설명하려고 노력했는데, 많은 도움이 되기를 바라겠습니다. 1. 공변과 불공변 [ 공변과 불공변 ] 제네릭과 와일드카드에 대해 이해하기 위해서 우리는 먼저 공변과 불공변에 대해 알아야 한다. 공변과 불공변은 각각 다음과 같다. 공변(covariant) : A가 B의 하위 타입일 때, T 가 T의 하위 타입이면 T는 공변 불공변(invariant) : A가 B의 하위 타입일 때, T 가 T의 하위 타입이 아니면 T는 불공변 대표적으로 배열은 공변이며, 제네릭은 불공변인데 이를 코드.. 바이트코드 조작 - 모자에서 토끼를 꺼내는 마술 바이트코드를 조작하는 것은 막강한 기능이다. 바이트 코드를 조작하는데 쓸 수 있는 라이브러리는 여러가지가 있지만 가장 고전적이고 널리 쓰이는 것은 asm이라는 것이 있다. userguide가 좀 어렵게 되어있다. visitor 패턴과 adapter 패턴을 잘 알고있어야 쓸 수 있다. 너무 어렵기 때문 javabuddy라는 것이 있는데 그나마 쉽다. 아무것도 없는 Moja에서 “Rabbit”을 꺼내는 마술 Moja.java public class Moja { public String pullOut() { return ""; } } Masulsa.java public class Masulsa { public static void main(String[] args) { System.out.println(new.. 바이트코드 조작 - 코드 커버리지는 어떻게 측정할까 코드 커버리지는 어떻게 측정할까? 바이트 코드를 조작해서 측정하는 것이다. 바이트 코드를 읽어서 코드 커버리지 챙겨야 하는 부분의 수를 counting 하고 코드가 실행될 때 그 중에 몇개의 로직이 지나갔는지 counting을 해서 비교해주는 것이다. 테스트 코드를 통해 확인한 소스 코드의 비율을 %로 나타낸 것이다. Moim이라는 클래스를 생성한다. Moim이라는 클래스에는 isEnrommmentFull 이라는 메서드가 존재하는데, 해당 메서드에는 세가지 로직이 존재한다. 테스트 코드를 작성해보자. 테스트 커버리지를 측정해주는 라이브러리인 JaCoCo를 사용해보도록 하자. https://www.eclemma.org/jacoco/trunk/doc/index.html http://www.semdesigns.. 클래스로더 시스템 클래스 로더 시스템 구조를 조금 더 자세하게 그리면 아래와 같이 그릴 수 있다. 여러개의 클래스 로더들이 (Bootstrap, Extension, Application) 부모 - 자식 간의 관계를 맺고 로딩을 한다. 링크라는 과정도 세부적으로 세단계로 나눠서 실행이 된다. 클래스 로더 로딩, 링크, 초기화 순으로 진행된다. 로딩 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 “메소드” 영역에 저장. 이때 메소드 영역에 저장하는 데이터 FQCN (Fully qualified class name, 패키지 경로를 포함한 클래스 이름) 클래스 | 인터페이스 | 이늄 메소드와 변수 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 “힙" 영역에 저장. 플랫폼 클.. JVM 구조 클래스 로더 시스템 .class 에서 바이트코드를 읽고 메모리에 저장 하는 역할은 크게 세가지로 나눌 수 있다. 로딩: 클래스 파일에서 바이트 코드를 읽어오는 과정 링크: 레퍼런스를 연결하는 과정 (링크도 크게 세가지로 나눌 수 있다.) 초기화: static 값들 초기화 및 변수에 할당 - 보충 개념 1. class 파일은 어디에 있을까? intellij에서 class 파일 찾기 class파일의 위치는 target/classes 아래 디렉터리에서 확인할 수 있다. 원래는 컴파일 되어있는 바이트 코드가 있어야 하는데 intellij 에서 확인하면 바이트 코드가 아닌 것을 확인할 수 있다. javap 같은 것을 사용해서 우리 눈에 조금 더 사람이 읽을 수 있는 코드로 보여주고 있는 것이라고 보면 된다. (바.. 자바, JVM, JDK 그리고 JRE JVM (Java Virtual Machine) 자바 가상 머신 자바 바이트 코드를 어떻게 실행할 지에 대한 표준 스펙 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행한다. 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체(특정 밴더가 구현한 JVM)다. JVM 스팩: https://docs.oracle.com/javase/specs/jvms/se11/html/ JVM 밴더: 오라클, 아마존, Azul, ... 특정 플랫폼에 종속적. (네이티브 코드로 바꿔서 실행해야 하는데 네이티브 코드가 OS에 맞춰서 실행해야 하기 때문에) 구현체는 다양하다. 컴파일 javac HelloJava.java HelloJava.class 다양한 종류의 Garbage Collection(가비지 컬렉션) 알고리즘 (2/2) 1. 다양한 Garbage Collection(가비지 컬렉션) 알고리즘 JVM이 메모리를 자동으로 관리해주는 것은 개발자의 입장에서 상당한 메리트이다. 하지만 문제는 GC를 수행하기 위해 Stop The World에 의해 애플리케이션이 중지되는 것에 있다. Heap의 사이즈가 커지면서 애플리케이션의 지연(Suspend) 현상이 두드러지게 되었고, 이를 막기 위해 다양한 Garbage Collection(가비지 컬렉션) 알고리즘을 지원하고 있다. [ Serial GC ] Serial GC의 Young 영역은 앞서 설명한 알고리즘(Mark Sweep)대로 수행된다. 하지만 Old 영역에서는 Mark Sweep Compact 알고리즘이 사용되는데, 기존의 Mark Sweep에 Compact라는 작업이 추가되었.. 이전 1 2 3 다음