📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page
  • String
  • 정규식
  • 박싱/언박싱
  • 가비지 컬렉션

Was this helpful?

  1. 이펙티브 자바

item6 - 불필요한 객체 생성을 피하라

이번 주제에 대해서는 익히 들었던 이야기이다 객체를 생성하게 되면 JVM의 힙 영역에 객체들이 생성되게 되고, 객체의 사용이 끝나면 가비지 컬렉터(GC)의 스캔 대상이 되어, 가비지 컬렉터가 돈다 가비지 컬렉터의 특징 중 하나는 STW(Stop The World) 으로, 가비지 컬렉터가 돌면서 JVM이 멈춘다는 점이다 그렇기 때문에 이걸 줄이기 위해서 불필요한 객체를 줄여야 한다고만 듣고, 최대한 객체를 생성해서 사용하는 것보다는 autowired 나 정적 팩토리 메소드를 통해서 사용하려고 노력중이다

책에서 언급했던 예시로는 크게 3가지가 있다 String 과 정규식 그리고 박싱/언박싱의 개념이다

String

우리가 자주 사용하는 String을 사용할 떄 new String() 이렇게 사용하는 것은 살면서 본적이 없을 것이다 실제로 한 번도 그러한 코드는 본적이 없다... (물론 코드를 그렇게 많이 보지는 않았지만..) JVM에서는 String을 내부의 풀에서 캐싱을 해두고 있다 일종의 해쉬맵에 만든 모든 String을 담아두고, 또 동일한 문자열을 참조하려고 하면 이미 만들어둔 풀에서 참조해서 가져오는 방법이다 물론, 만약에 같은 JVM에서 생성된 문자열이 아니면 다를 수 도 있다 예를 들면, 외부 api에서 받아온 String과 내부에서 생성한 String 같은 경우에는 같은 JVM 태생이 아니기 때문에 다르다 -> 그래서 일반적인 equals을 통해서 비교 그래서 같은 문자열을 가지고 ==을 통해서 비교하게되면 같다고 나온다 하지만 new String을 통해서 만들어버리면 ==을 통해서 비교해보면 다르다고 나온다

정규식

정규식을 생성하는 방법인 Pattern.compile()이라는 함수는 객체 생성하는데 있어서 자원을 많이 먹는 객체 중 하나이다 String.matches()을 통해서 비교하는 과정을 그냥 기본적으로 생성해서 사용해보는 것과 따로 static final로 빼두고 가져와 사용하는 것과는 해당 메소드를 100번씩만 호출해도 벌써 100배 정도의 차이가 나는 것을 확인할 수 있었다

그래서 static final 와 같이 만들어두고 사용하는 것 처럼 캐싱을 통해 재사용을 하는게 좋다

박싱/언박싱

객체의 타입에는 박싱/언박싱 개념이 있다

크게 primitive 타입과 wrapper 타입 이렇게 나뉘어진다 primitive 타입을 우리가 알고 있는 int, boolean, long 등의 소문자 객체 타입을 의미한다 그럼 반대인 wrapper 타입은 생각보다 생소한 Integer, Boolean, Long 과 같은 박싱 타입을 의미하는데 이것들은 primitive 객체와는 다르게 null-safe한 장점이 존재한다 null-safe이라고 하니까 뭔가 거창해보이지만, wrapper 타입으로 사용하게되면 하나의 객체로 생성이되어, null이 들어갈 수도, 메소드를 사용할 수도 있다는 점이다

이렇게 2가지 타입을 동시에 사용하는 케이스에 의도치않게 박싱/언박싱 과정에서 불필요한 객체가 만들어진다는 것

가비지 컬렉션

가비지 컬렉션을 공부하는데 있어서 세 가지를 중점으로 알아보라고 했다 - 개념, 옵션들, 툴 여기서 툴이란, gd가 발생할 때 그것들을 모니터링 할 수 있는 그러한 툴을 이야기한다

객체의 사용이 끝나면 가비지 컬렉터가 객체를 수거해간다고 하는데, 어떠한 객체들을 기준으로 수거해가는걸까? -> 객체를 생성하게 되면, 그 객체를 생성한 메소드가 끝나는 순간, 그 객체를 일반적으로 더는 사용하지 않는다 그러면 그렇게 참조를 더 이상 받지 않는 그러한 객체들을 기준으로 가비지 컬렉션의 객체 수거 대상이 된다

가비지 컬렉션에서의 알아야 할 3가지

  • Mark : 더 이상, 객체가 참조되고 있는지 아닌지에 대한 표시를 해두는 그러한 개념이다. 가비지 컬렉션의 대상이냐 아니냐 이걸 판단하는 지표

  • Sweep : 필요 없는 객체를 메모리인 Heap에서 날리는 단계

  • Compact : 객체를 sweep 하기 위해서는 모든 메모리를 훑으면서 마크가 되어 있는 객체를 찾아서 뽑아가야 한다, 근데 이러한 단계는 비효율적이기 때문에 메모리를 한 번 쓱 훑으면서 마크된 객체들을 한 곳으로 몰아두었다가 한꺼번에 수거하기 위해서 객체를 모으는 그러한 개념이다

Young Generation, Old Generation 객체의 생명주기가 긴 건 그렇게 많지 않다 근데 가끔씩 애플리케이션이 돌면서 아주 오랜 시간 동안 남아있는 객체가 존재하긴 하기 때문에 이렇게 2가지의 영역으로 나누었다 Young Generation 에는 Eden, Space0(S0), Space1(S1) 이렇게 나누어져있으며, 이 공간들에서 객체들이 돌아다니게 된다 항상 처음으로는 Eden 으로 가지만, 만약 Eden 공간이 가득 차게 된다면 S0, S1 을 돌아가면서 영역 할당을 해서 채우게 된다 S0와 S1에 대한 순서는 상관없다 이렇게 Young Generation 에서 이리저리 왔다갔다 하다가 지속적으로 살아남는 객체를 확인하면 Old Generation으로 옮겨지는 그러한 순서로 되어 있다

Minor GC, Full GC Young Generation 에서 일어나는 GC가 Minor GC 이며, Young Generation 과 Old Generation 모두에서 일어나는 대규모 GC 가 Full GC 이다 여기서 full gc에는 다양한 종류가 존재한다 옵션처럼 원하는 알고리즘으로 돌아가도록 설정할 수 있는데, 기본적으로 java8 에서는 parallel GC 이다. 사실 serial GC 나 parallel GC 나 방식은 같지만 단지 스레드 차이이다 이외에도 CMS, G1, ZGC, Shenandoah 이렇게 존재하는데 이것들을 공부하면서 확인해야할 사항이 있다 위의 GC들을 공부하면서 바라봐야할 3가지 관점이 있다 -> Throughput, Latency(STW), Footprint

  • Throughput : 애플리케이션을 처리할 수 있는 처리량을 의미, 서버가 100이 있다고 가정했을 때 가비지 컬렉터는 일정 주기마다 돌지만, 원한다면 100 중에 5 정도만 빼두고 거기에서 GC 의 단계인 Mark-Sweep-Compact 만 돌리는 것이 가능하다 이렇게 되면 throughput 이 95만큼만 적용되는 것이고 각 full gc 에는 다른 throughput 을 가지고 있다는 점을 인지하고 확인하자

  • Latency(Stop The World) : 애플리케이션에서 GC가 일어나게 되면 애플리케이션이 멈춘다 오직 GC만 작업되고 있으며 모든 나머지 작업은 멈춘 상태이다 그리고 이러한 것을 보고 Stop The World 이라고 한다. 그래서 멈추는 것은 당연하게 좋지 않기 때문에 latency 를 어떻게 하면 최대한으로 줄일 수 있을지에 대한 고민을 해봐야 한다. 위에서 봤던 CMS gc 부터는 latency 가 애플리케이션의 용량과 상관없이 적게 나타난다고 한다 역시 최신

  • Footprint : 이건 GC 가 돌기 위해서 애플리케이션에서 얼마만큼의 공간을 잡아먹고 있느냐이다 즉, GC 알고리즘이 돌기 위해서 잡아먹는 메모리 양을 의미한다.

ZGC 을 추천해주시네 저 알고리즘이 latency를 많이 고려한 그러한 알고리즘인가 보네요 간단하게 보면 자바 11부터 옵션으로 설정해줄 수 있으며 특징으로는 Low Latency 으로, STW 시간이 10초 미만으로 확인됨 그리고 Scalable 으로, heap 사이즈나 라이브의 사이즈가 커져도 STW 시간이 늘어나지는 않는다 재밌는건 ZGC의 목표는 위의 특징 2가지도 가지고 있었으며 G1 보다 애플리케이션 처리율이 15% 이상 떨어지지 않을 것이였다 아무튼 G1 보다 짧은 Latency 를 가지면서 G1 보다 더 좋은 퍼포먼스를 가지기 위한 목표라는 점이다 언젠간 G1보다 많이 쓰일 날이 오긴 하겠구나...

그래서 객체를 줄이는게 베스트이다? 는 아니고, 객체 지향 언어인데 객체를 잘 사용하라는 의미이지만 그렇다고 줄이기에 급급하면 static 으로만 만들고, 이는 또 메모리에 부담을 주는 일이다 즉, 뭐든 과하지 않고 객체를 많이 많이 사용하되, 정말 필요 없는 케이스에는 사용하지 말라는 의미이다

@Deprecated 만약에 더이상 사용하지 않는 메소드가 있거나 대체제가 나와서 앞으로 사용되지 않을 예정인 그러한 케이스를 가진 메소드에다가 사용하는 애노테이션이다 앞으로 사용되지 않을 예정이거나 오직 과거의 하위호환성을 위해서 남겨둔 그러한 메소드나 필드에 달 수 있다 만약 그렇게 달아두게 되면, 컴파일러로 하여금 -(줄)을 이런식으로 그어지게 된다 이외에도 javadocs에서 @deprecated을 통해서 명시도 가능하다

Previousitem5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라Nextitem7 - 다 쓴 객체 참조를 해제하라

Last updated 2 years ago

Was this helpful?