728x90
💪 본 내용은 한국 소프트협회에서 직장인 대상 교육 및 다른 블로그를 읽고 정리한 내용입니다.
준비 사항
※ 실습 코드는 제외하고 작성했습니다.
- Eclipse 2022-09 + 설치
- MySQL 8.0 설치
- JDK 11
- Visual Studio Code - Editor
- Jmeter
수업 내용
목차
- JVM
- Stack & Heap
- 자바 기본
- Class Loader
- JVM JIT Compiler
--- 이하 2일차 --- - GC
- 성능 향상
- 성능 최적화
- GC & Heap
- 성능 튜닝
- 성능 테스트
들어가기 전
- Editor vs IDE(Integrated Development Environment)
- 두 경계가 무너지고 있는 느낌이다
- 선생님 왈, VS code는 IDE라고 보는게 맞는 것 같다.
- 컴파일러, 디버그 등등 모든 것을 다 가지고 있는 것을 IDE라고 한다.
성능향상
- 코드의 실행 환경을 이해하고 코딩하며, 실행 환경을 적절히 설정하여 성능을 향상한다.
- 프로그래밍 언어의 특징을 이해하고 코드를 개선하여 성능을 최적화 한다.
- Array(배열)보다 Collection을 주로 사용한다.
- 애플리케이션의 선능을 프로파일링하고 모니터링하여 성능을 개선한다.
- 성능 측정 후 병목 현상이 일어나는 부분 개선하기
- 참고사항
- 코드의 성능도 중요하나 유지보수성, 가독성, 안정성 등의 품질도 매우 소중하기에 개발 표준을 준수해야 하며, 검증된 프레임워크를 사용해야한다.
트러블 슈팅
- classpath 문제
Hello.class 파일을 CMD(명령 프롬프트)에서 실행하려고 하는데 아래와 같은 Error가 발생했다.classpath 경로 문제 에러 - 해결 방법
- set classpath=%classpath%;.
- JVM이 프로그램을 실행할 때, 클래스파일을 찾는 경로를 새로 설정해줬다.
- java -XX:+PrintCompilation hello.Hello
- JVM이 Just-In-Time(JIT) 컴파일러를 사용하여 메서드를 기계어 코드로 컴파일하는 시점과 관련 정보를 실시간으로 확인할 수 있습니다.
- classpath 란?
- 해결 방법
- Java Version
JVM
1) 개요
- JRE(Java Runtime
- JVM은 자바 애플리케이션을 Class Loader를 통해 메모리로 읽어 들여서 자바 API와 함께 실행한다.
-XX:+UserG16GC 요게 Garbage Collector 이다.
2) JVM 특징
- 스택 기반의 가상 머신
- 인텔x86 아키텍처나 ARM 아키텍처와 같은 하드웨어는 레지스터기반으로 동작하는데 반해 JVM은 스택기반으로 동작한다.
- 심볼릭 레퍼런스
- 기본 자료형(Primitive data type)을 제외한 모든 타입을 명시적인 메모리 주소기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다.
- Garbage Collection
- 클래스 인스턴스는 사용자 코드에 의해 메모리에 명시적으로 생성되어 실행된 후 Garbage Collection에 의해 자동으로 메모리에서 사라진다.
실행 명령어: java -Xmx20m -XX:+PrintFlagsFinal hello.Hello
3) JVM 구조
- Class Loader가 컴파일 된 자바 바이트 코드를 런타임 데이터 영역(Runtime Data Areas)에 로드한다.
- Source Code(.java) → comiler(javac.exe) → Byte Code(.class) → Class Loader → Runtime Data Areas
- 실행 엔진(Execution Engine)이 자바 바이트 코드를 실행
- Class Loader
- 부트스트랩 Class Loader
- Extension Class Loader
- System Class Loader
- 사용자 정의 Class Loader(User-Defined Class Loader)
- JIT Compiler
- 인터프리터와 JIT 컴파일러
- 자바 바이트코드는 기계가 바로 수행할 수 있는 언어가 아니다.
- 실행 엔진은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다.
- 두 가지 방식
- 인터프리터
- 바이트코드 명령어를 하나씩 읽어서 해석하고 실행한다.
- 하나씩 해석하고 실행하기 떄문에 바이트 코드 하나 하나의 해석은 빠른 대신 인터프리팅 방식의 실행은 느리다.
- 바이트코드라는 '언어'는 기본적으로 인터프리터 방식으로 동작한다.
- JIT 컴파일러
- 인터프리터
- 인터프리터와 JIT 컴파일러
4) JVM 메모리 구조
- Heap Memory
- 객체가 생성되어 존재하는 곳
- JVM이 시작되면 초기 크기로 구성되어 MaxSize까지 늘어난다.
- -Xms512m → 할당 메모리의 초기 크기: 512M
- -Xmx4g → 할당 메모리의 최대 크기: 4G
- 객체는 가비지 커렉터에 의해 제거될 떄까지 Heap 존재한다.
- Young generation
- Eden: 객체가 생성되면 존재하는 곳
- Survivor: Minor GC가 수행된 후 살아남은 객체가 존재
- Old generation
- minor GC 동안 최대 tenure 임계값에 도달한 객체들이 살아가는 곳입니다.
⇒ "tenure 임계값"은 객체가 young generation(젊은 세대) 공간에서 살아남은 GC(가비지 컬렉션) 횟수를 말합니다. - 이 공간은 "Major GC"에 의해 관리됩니다.
- minor GC 동안 최대 tenure 임계값에 도달한 객체들이 살아가는 곳입니다.
- Thread Stacks
- JVM 스택은 각 스레드(Thread)마다 하나씩 존재하며 스레드가 시작될 때 생성된다.
- 프로세스 내의 각 스레드마다 하나의 스택 메모리가 있습니다
- 스레드별 정적 데이터, 메소드/함수 프레임, 그리고 객체들을 가리키는 포인터들이 저장되는 곳입니다
- MetaSpace
- Natvie Memory의 일부분이며, 이전의 JVM에서 PermGend으로 알려진 곳이다.
- 디폴트로 상한값을 갖지 않는다.
- 해당 공간이 커지면 RAM에서 가상 공간을 이용하게 될 수 있기에 속도가 저하될 수 있다.
- XX: MetaspaceSize로 설정 가능
- XX: MetaspaceSize 플래그는 OutOfMemory 오류가 발생할 수도 있다.
- 클래스 메타데이터(클래스, 메소드, 필드 정보 등이 저장되는 영역)
- 상수 풀(Constant Pool): 클래스 파일에서 사용되는 상수들이 저장되는 영역
- 문자열, 정수, 부동소수점 등의 상수 값이 저장
- Symbol Table: JVM이 관리하는 심볼(변수, 메소드, 클래스 이름 등) 정보를 저장하는 해시 테이블이다.
- Interned Strings: 문자열 상수들을 저장하는 영역으로, 문자열 리터럴 들의 중복을 방지하기 위해 사용된다.
- Code Cache
- JIT 컴파일러가 컴파일 된 코드를 보관하는 곳이다.
- Shared Libs
- 공유 라이브러리가 저장된다.
5) Stack vs Heap
- 함수가 호출되면 스택에 쌓인다. 함수 실행이 종료되면, 할당받은 메모리는 리셋 된다.
- 지역 변수와 매개 변수 및 리턴 타입은 스택 영역에서 메모리를 할당받는다.
- 스택은 자동으로 관리되지만, Heap은 상황에 따라 부족해질 수 있으며 애플리케이션이 느려지고 실행이 중지되기도 한다.
작성 중
코드 확인
성능 향상
성능 최적화
1) Collection
- Set
- HashSet
- TreeSet
- LinkedHashSet
- Map
- 키(key)와 값(value)의 쌍으로 구성된다.
- 중복 키를 허용하지 않는다.
- Hashtable, HashMap, TreeMap, LinkedHashMap 등이 있다.
- TreeMap은 다른 Map보다 상당히 느리므로 키를 차례대로 나열할 필요가 없다면 사용하지 않는 것이 좋다.
- 적은 데이터는 의미가 없지만, 수천만 등 누적 되어서 실행 될 때 차이가 보인다.
- 코딩은 lambda와
for(int loop=0;loop<list.size();loop++) {
resultProcess(list.get(loop));
}
for(Integer loop: list) {
resultProcess(loop);
}
list.forEach(element -> resultProcess(element));
컨테이너 객체
- 컨테이너 객체는 대부분 재사용이 가능하다.
객체 생성
hikaricp
c3p0
참고사이트
🚀 Visualizing memory management in JVM(Java, Kotlin, Scala, Groovy, Clojure)
Let us take a look at how the JVM manages memory.
deepu.tech
'교육 > [온라인] KOSTA EDU' 카테고리의 다른 글
[KOSTA] Kafka with Spring Boot - 1편 (0) | 2024.07.12 |
---|---|
[KOSTA] Java 기반의 객체지향 프로그래밍 1주차 (0) | 2024.06.22 |
[KOSTA] 스프링 부트로 구현하는 메세징 시스템(RabbitMQ) (0) | 2024.05.24 |
[KOSTA] 도메인 모델 기반의 서비스 설계 (DDD) (0) | 2024.05.17 |
[KOSTA] 자바 코드의 성능 향상 - 2일차 (0) | 2024.02.23 |