Post

자바 성능 튜닝 이야기 2주차

자바 성능 튜닝 이야기 2주차

들어가며

이 포스트는 이상민의 「자바 성능 튜닝 이야기」 Chpater2 ~ 3을 읽고 개인적으로 학습한 내용을 정리한 글입니다.

  • 책: 자바 성능 튜닝 이야기
  • 저자: 이상민
  • 출판사: 인사이트
  • 챕터: Chapter2 ~ Chapter 3

핵심 내용 정리

2장 프로파일링 툴

|구분|특징| |——|—| |프로파일링 툴| - 소스 레벨의 분석을 위한 툴
- 애플리케이션의 세부 응답 시간까지 분석 가능
- 메모리 사용량을 객체나 클래스, 소스의 라인 단위까지 분석 가능
- 가격이 APM 툴에 비해 저렴
- 보통 사용자수 기반으로 가격이 결정
- 자바 기반의 클라이언트 프로그램 분석 가능| |APM 툴 | - 애플리케이션의 장애 상황에 대한 모니터링 및 문제점 진단이 주 목적
- 서버의 사용자 수나 리소스에 대한 모니터링 가능
- 실시간 모니터링을 위한 툴
- 가격이 프로파일링 툴에 비해 비쌈
- 보통 CPU 수를 기반으로 가격 결정
- 자바 기반의 클라이언트 프로그램 분석이 불가능|

  • 프로파일링 툴의 기본 제공 기능
    • 응답 시간 프로파일링 기능
      • 하나의 클래스 내에서 사용되는 메서드 단위의 응답 시간을 측정
      • 응답 시간 프로파일링 시 CPU 시간, 대기 시간 두 가지 시간이 제공
    • 메모리 프로파일링
      • GC 대상 부분 찾기 , Memory Leak 발생 부분을 확인하기 위함
      • 클래스 및 메서드 단위의 메모리 사용량이 분석

System 클래스

  • static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    • 특정 배열을 복사할 때 사용
  • static Properties getProperties()
    • 현재 자바 속성 값 가져오기
  • static String getProperty(String key)
    • key에 지정된 자바 속성 값을 받아 온다
  • static String getProperty(String key, String def)
    • key에 지정된 자바 속성 값을 받아온다
  • static String setProperty(Properties props)
    • props 객체에 담겨 있는 내용을 자바 속성에 지정
  • static String setProperty(String key, String value)
    • 자바 속서엥 있는 지정된 key의 값을 value 값으로 변환
  • static Map<String, String> getenv()
    • 현재 시스템 환경 값 목록을 스트링 형태의 맵으로 리턴
  • static String getenv(String name)
    • name에 지정된 환경 변수 값을 얻어온다

      절대로 사용해서는 안되는 메소드

  • static void gc()
    • GC를 수행하는 메서드
  • static void exit(int status)
    • 현재 수행중인 자바 VM을 종료
  • static void runFinalization()
    • 이 메서드를 호출하면 참조 해제 작업을 기다리는 모든 객체의 finalize() 메서드를 수동으로 수행해야 한다

System.currentTimeMillis 와 System.nanoTime

  • System.currentTimeMillis 와 System.nanoTime
    • System.nanoTime이 조금 더 정확함

3장 왜 자꾸 String을 쓰지 말라는 거야

StringBuffer 클래스와 StringBuilder 클래스

  • StringBuffer
    • Thread Safe
  • StringBuilder
    • 단일 스레드에서의 안전성만 보장

String vs StringBuffer vs StringBuilder

|주요 소스 부분|응답 시간(ms)| 비고 | |——|—|—| | a+= aValue;| 95.801.41ms | 95초| | b.append(aValue);
String temp = b.toString(); | 247.48ms
14.21ms | 0.24초| | c.append(aValue);
String temp2 = b.toString(); | 147.17ms
13.38ms | 0.17초|

주요 소스 부분메모리 사용량(byte)생성된 임시 객체수비고
a+= aValue;100.102.000.0004.000.000약 95Gb
b.append(aValue);
String temp = b.toString();
29.493.600
10.004.000
1.200
200
약 28Mb
약 9.5mb
c.append(aValue);
String temp2 = b.toString();
29.493.600
10.004.000
1.200
200
약 28Mb
약 9.5mb
  • String의 경우 a에 aValue를 더하면 새로운 String 클래스의 객체가 만들어지고 기존의 a 객체는 GC 대상이 되어버림
    • 이 작업을 반복 시 메모리 사용량이 올라가고 응답 속도도 느려진다
  • StringBuffer, StringBuilder는 String과 다르게 새로운 객체를 생성하지 않고, 기존의 객체 크기를 증가시키면서 값을 더한다
This post is licensed under CC BY 4.0 by the author.