교육/[온라인] KOSTA EDU

[KOSTA] 자바 코드의 성능 향상 - 1일차

코드몬스터 2024. 2. 22. 09:21
728x90

 

💪 본 내용은 한국 소프트협회에서 직장인 대상 교육 및 다른 블로그를 읽고 정리한 내용입니다.

 

 

준비 사항

※ 실습 코드는 제외하고 작성했습니다.

  1.  Eclipse 2022-09 + 설치
  2. MySQL 8.0 설치
  3. JDK 11
  4. Visual Studio Code    - Editor
  5. Jmeter

이클립스 설치 버전


수업 내용

목차

  1. JVM
  2. Stack & Heap
  3. 자바 기본
  4. Class Loader
  5. JVM JIT Compiler
    --- 이하 2일차  ---
  6. GC
  7. 성능 향상
  8. 성능 최적화
  9. GC & Heap
  10. 성능 튜닝
  11. 성능 테스트

 

들어가기 전

  • Editor vs IDE(Integrated Development Environment)
    • 두 경계가 무너지고 있는 느낌이다
    • 선생님 왈, VS code는 IDE라고 보는게 맞는 것 같다.
  • 컴파일러, 디버그 등등 모든 것을 다 가지고 있는 것을 IDE라고 한다.

 

성능향상

  • 코드의 실행 환경을 이해하고 코딩하며, 실행 환경을 적절히 설정하여 성능을 향상한다.
  • 프로그래밍 언어의 특징을 이해하고 코드를 개선하여 성능을 최적화 한다.
    • Array(배열)보다 Collection을 주로 사용한다.
  • 애플리케이션의 선능을 프로파일링하고 모니터링하여 성능을 개선한다.
    • 성능 측정 후 병목 현상이 일어나는 부분 개선하기
  • 참고사항
    • 코드의 성능도 중요하나 유지보수성, 가독성, 안정성 등의 품질도 매우 소중하기에 개발 표준을 준수해야 하며, 검증된 프레임워크를 사용해야한다.

 

트러블 슈팅

  1. classpath 문제
    Hello.class 파일을 CMD(명령 프롬프트)에서 실행하려고 하는데 아래와 같은 Error가 발생했다.
    classpath  경로 문제 에러
    • 해결 방법
      • set classpath=%classpath%;.
      • JVM이 프로그램을 실행할 때, 클래스파일을 찾는 경로를 새로 설정해줬다.
    • java -XX:+PrintCompilation hello.Hello
      • JVM이 Just-In-Time(JIT) 컴파일러를 사용하여 메서드를 기계어 코드로 컴파일하는 시점과 관련 정보를 실시간으로 확인할 수 있습니다.
    • classpath 란?
  2. 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

MaxHeapSize 크기

 

InitialHeapSize 크기

 

 

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 컴파일러

 

JVM 구조

 

4) JVM 메모리 구조

  1. 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"에 의해 관리됩니다.
  2. Thread Stacks
    • JVM 스택은 각 스레드(Thread)마다 하나씩 존재하며 스레드가 시작될 때 생성된다.
    • 프로세스 내의 각 스레드마다 하나의 스택 메모리가 있습니다
    • 스레드별 정적 데이터, 메소드/함수 프레임, 그리고 객체들을 가리키는 포인터들이 저장되는 곳입니다
  3. MetaSpace
    • Natvie Memory의 일부분이며, 이전의 JVM에서 PermGend으로 알려진 곳이다.
    • 디폴트로 상한값을 갖지 않는다.
    • 해당 공간이 커지면 RAM에서 가상 공간을 이용하게 될 수 있기에 속도가 저하될 수 있다.
      • XX: MetaspaceSize로 설정 가능
      • XX: MetaspaceSize 플래그는 OutOfMemory 오류가 발생할 수도 있다.
    • 클래스 메타데이터(클래스, 메소드, 필드 정보 등이 저장되는 영역)
    • 상수 풀(Constant Pool): 클래스 파일에서 사용되는 상수들이 저장되는 영역
      • 문자열, 정수, 부동소수점 등의 상수 값이 저장
    • Symbol Table: JVM이 관리하는 심볼(변수, 메소드, 클래스 이름 등) 정보를 저장하는 해시 테이블이다.
    • Interned Strings: 문자열 상수들을 저장하는 영역으로, 문자열 리터럴 들의 중복을 방지하기 위해 사용된다.
  4. Code Cache
    • JIT 컴파일러가 컴파일 된 코드를 보관하는 곳이다.
  5. Shared Libs
    • 공유 라이브러리가 저장된다.

JVM 메모리 구조

 

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