자바 성능 튜닝 이야기 - week1

eunsol Jo·2022년 3월 15일
0

책 : 자바 성능 튜닝 이야기 (이상민)
기간 : 2022.03.15 ~ 2022.05.31 (총 12주)

story01. 디자인패턴

MVC 패턴

  • View - 이벤트 발생 + 이벤트 결과 보여줌
  • Controller - view와 model의 연결자
  • Model - 이벤트의 실질적인 일을 처리

JSP 모델

  • JSP 모델1
    • 브라우저 ↔ JSP ↔ 자바빈 ↔ DB : 요청을 바로 JSP로 날린다.
  • JSP 모델2
    • 브라우저 ↔ Servlet ↔ JSP ↔ 자바빈 ↔ DB (Servlet ↔ 자바빈, JSP를 생략한 요청도 가능) : 요청을 Servlet(Controller역할)이 받아서 처리

⇒ JSP 모델1은 한페이지에서 호출+이벤트 처리. 중복호출의 이슈 및 추후 유지보수 측면에서 좋지 않다.

J2EE

Transfer Object 패턴 = Value Object

  • 객체에 여러 타입의 값전달
  • 필드를 private으로 해서 정보은닉 + 캡슐화
  • Implements Serializable
    - 객체의 직렬화

    참조 : DTO & VO & DAO & Entity
    DTO(controller) ← DAO(repository)← Entity(domain) ← DB
    DTO = VO(readonly)

Service Locator 패턴

  • code
    public class ServiceLocator {
    
        private InitialContext ic;
        private Map cache;
        private static ServiceLocator me;
    
        static {
    				me = new ServiceLocator();
        }
    
        private ServiceLocator() {
    				cache = Collections.synchronizedMap(new HashMap<>());
        }
    
        public InitialContext getInitialContext() throws Exception {
    				try {
    				    if (ic == null) {
    								ic = new InitialContext();
    				    }
    				    
    				} catch (Exception e) {
    				    throw e;
    				}
    				return ic;
        }
        
        public static ServiceLocator getInstance() {
    				return me;
        }
    
    }
  • chache에 담아두고 매번 생성하지 않고 사용
    • ex.DB의 datasource lookup시에 응답속도를 감소
  • 참조 : 서비스 로케이터는 안티패턴이다

story02. 프로그램의 속도

profiling tool

  • 시스템 문제 분석 툴
  • 개발자용 툴
  • 응답시간 : CPU시간(=CPU점유시간=Thread시간) & 대기시간
  • 메모리 : 잠시사용후 GC대상 & 메모리부족현상

APM(Application Performance Monitoring or Management) tool

  • WebTune(무료), Pharos, Instroscope, dynaTrace..
  • 운영 환경용 툴

System 클래스

  • static void arrayCopy(...)

▶︎ 속성(property)

  • static Properties getProperties()
  • static String getProperty(String key)
  • static String getProperty(String key, String def)
    • def는 값이 없을경우 디폴트값
  • static void setProperty(Properties props)
  • static String setProperty(String key, String value)

▶︎ 환경(Environment)

  • static Map<String, String> getenv()
    • 시스템 환경설정 값을 스트링 맵으로 리턴
  • static String getenv(String name)

▶︎ 네이티브 라이브러리

  • static void load(String filename)
    • 파일명을 지정하여 네이티브 라이브러리를 로딩
  • static void loadLibrary(String libname)
    • 라이브러리 이름을 지정하여 네이티브 라이브러리를 로딩

▶︎ 작성 금지 메서드

  • static void gc()
    • 메모리 해제
  • static void exit(int status)
    • 현재 수행중인 VM을 멈춤
  • static void runFinalization()
    • Object의 finalize()는 GC가 더이상 참조 하지 않아도 될때 자동으로 호출
    • 위 메서드는 참조 해제를 기다리는 객체를 수동으로 해제하게함

JVM 설정

  • 속성(property) - JVM에 설정된 값
  • 환경(Environment) - 장비(서버)에 지정된 값

System.currentTimeMillis & System.nanoTime

  • static long currentTimeMillis()
    • 현재시간 ms으로 반환
    • UTC (한국, UTC+9)
    • long 반환타입
  • static long nanoTime()
    • 보다 정확하지만 10^9으로 계산이 어려움
    • 시간비교시 사용
    • 일자비교시는 너무 단위가 작아서 비추
  • 시간비교 라이브러리
    • JMH, Caliper, JUnitPerf, JUnitBench, ContiPerf(ms단위)
      - JMH 예제소스 p.35
profile
Later never comes 👩🏻‍💻

0개의 댓글