자바 성능 튜닝 이야기 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)
- 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.000 | 4.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.