📖
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
  • JVM 이란?
  • JVM의 메모리 구조
  • Garbage Collection?

Was this helpful?

  1. 인턴 스터디

JVM의 메모리 구조, Garbage Collector

PreviousStream, Optional, 람다식NextRESTful API

Last updated 3 years ago

Was this helpful?

참고 :

JVM 이란?

Java Virtual Machine의 약자로 컴퓨터가 자바 프로그램을 실행할 수 있도록 하는 추상 컴퓨팅 기계이다.

이는 코드를 불러오고, 코드를 검증하고, 코드를 실행하고, OS에서 할당받은 메모리 + 힙 압축 + 가비지 개체 제거를 포함한 Java 할당 관리, 런타임 환경(Runtime Data Area) 제공을 한다.

JVM의 메모리 구조

자바 클래스 파일을 실행하게 되면 각 컴퓨터 OS로부터 메모리를 할당 받는다. 거기서 JVM이 돌아가기 시작하고, class파일들이 JVM위에서 해석되게 된다.

JVM이 메모리를 할당 받게 되면 Runtime Data Area가 할당 받게 된다.

Runtime Data Area은 크게 5가지 영역으로 나누게 된다.

Method Area, Heap Area, Stack Area, PC Register, Native Method Stack

Heap Area

객체를 저장할 때 사용하는 메모리 영역

처음에 JVM이 시작할 때 만들어지고, 크기는 키우고 줄이는 것이 가능하다. 그리고 가비지 컬렉션 전략에 의해서 크기가 고정된 크기일 수도 있고, 가변적인 크기일 수도 있다. 기본 값으로는 64MB 크기를 가지고 있다.

Method Area

메소드들의 바이트코드, static 변수, 런타임 상수 등이 위치하게 된다.

Stack Area

임시 값들이 생성되는 영역이다. 임시 값이라고 함은 메소드 인자, local 변수, 임시 변수 등을 의미한다. 각 클래스가 실행될 때 마다 새로운 Stack Area가 구성된다. 그리고 이 영역은 스레드당 하나씩만 존재하고 공유자원이 아니다.

public class Test { static int tmp=10; public static void main(String[] args) { Person p = new Person(); } static class Person{ }}

예시를 들어서 위의 코드가 실행되게 된다면,

Method Area 에는 main()에 대한 바이트 코드, Person에 대한 바이트 코드, 그리고 전역 변수인 tmp가 들어가게 된다.

Stack Area는 main이 실행되면서 생성되게 되고, Person 타입의 p변수, main의 인자인 args가 들어가게 된다.

Heap Area 에는 new 키워드를 통해서 생성한 Person이라는 객체가 들어가게 되고, Stack Area에 들어간 변수 p가 이곳의 객체를 참조하게 된다. 그리고 main의 인자인 args는 따로 가리키는 객체가 없기 때문에 null을 가리키게 된다.

PC Register

Program Counter의 줄인 말으로, 스레드당 하나씩 존재하고, 스레드가 실행될 때 지시를 이행한 후, 끝나면 다음 실행될 지시의 주소를 가리킴

Native Method Stack

스레드와 네이티브 코드로 작성된 코드 사이를 매핑하는 역할을 수행

Garbage Collection?

자바 이전의 모든 프로그램의 메모리는 프로그래머가 알아서 관리해줘야 했다. 하지만 Garbage Collection 이라는 프로세스로 인해서 메모리 관리를 프로그래머가 하지 않아도 이게 알아서 관리를 해주게 되었다. 구체적으로는 Heap Area을 체크해서 불필요한 객체를 찾고, 제거하는 작업을 수행한다.

프로그램 상에서 더 이상 사용하지 않는 메모리를 찾아서 알아서 제거해주는 역할을 해주는 관리 프로세스라고 생각할 수 있다.

크게 3가지 단계로 작업이 이루어지게 된다

  1. marking : gc가 어떤 객체가 사용되고 있고, 어떤 객체가 사용되지 않는지 찾는 단계

  2. normal deletion : 사용되지 않는 객체를 제거하고, 남은 자리를 다른 객체들에게 할당하기 위해서

  3. deletion with compacting : 사용되지 않는 객체를 제거하고 나서, 살아있는 모든 객체의 위치를 다시 재조정 한다. 이 과정을 통해서 새로운 객체에게 메모리를 할당할 때 성능이 향상된다.

STW?

Stop-The-World는 GC가 실행되는 스레드를 제외한 나머지 모든 스레드를 멈추는 작업이다. GC가 작업을 완료하면 그때 다른 스레드들이 작업을 시작하게 된다.

결과적으로 GC 실행을 위해서 애플리케이션을 멈추는 것이다. 추가적으로 GC튜닝이란 STW시간을 줄이는 것이다!

Garbage Collection 의 작동 원리

참조

JVM의 Runtime Data Area에 있는 Heap에서 작동하게 되는데

Heap Area는 크게 2개의 물리적 공간으로 나뉘어져 있다. 그 두 공간은 Young Generation 영역과 Old Generation 영역이다.

Young Generation 영역 : 새롭게 생성한 객체의 대부분이 여기에 위치하게 된다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 볼 수 있다.

Old Generation 영역 : Young Generation 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young Generation의 영역보다 더 크게 할당 되며, 크기가 큰 만큼 Young Generation 영역보다 GC가 적게 발생한다. 여기서 객체가 사라질 때 Full GC가 발생한다고 볼 수 있다.

Permanent Generation 영역 : Method Area 라고 하며, 객체나 억지로 머물게 된 문자열 정보를 저장하는 곳이며, Old 영역에서 살아남은 객체가 영원히 남아 있는 곳은 절대 아니다. 그리고 이곳은 기본적으로 데이터가 가득 차면 GC를 실행한다.

Young Generation 영역 구성

= Eden + Survivor 1 + Survivor 2

new 키워드 등을 사용해서 새롭게 생성한 객체의 대부분은 Eden 영역에 위치하게 된다.

Eden 영역에서 GC가 발생하고 살아남은 객체는 Survivor 1, 2 중 하나로 이동하게 된다.

만약 Survivor 영역 중 하나가 가득 차게 된다면, 살아있는 객체를 다른 Survivor 영역으로 이동시킨다. 그리고 가득 찬 Survivor 영역에는 아무런 데이터도 없는 상태로 된다.

이렇게 반복하면서 계속 살아있는 객체는 Old Generation 영역으로 이동 시킨다.

GC 종류

  • Serial GC - mark-sweep-compaction 알고리즘을 사용한다. 1단계로 mark으로 살아있는 객체를 식별, 2단계로 Heap Area의 앞 부분부터 확인하여 살아 있는 것만 남기고(Sweep) 3단계로 각 객체들이 연속되게 쌓이도록 Heap의 가장 앞 부분부터 채워서 객체가 존재하는 부분과 객체가 없는 부분으로 나눈다(Compaction). 하지만 데스크톱의 CPU코어가 하나만 있을 때 사용하기 위해서 만든 방식이기 때문에 운영 서버에서는 절대 사용하면 안 되는 방식

  • Parallel GC - Serial GC와 같은 알고리즘을 사용하지만 GC를 처리하는 스레드가 여러 개이다 / Java 8에서 default GC

  • Parallel Old GC - mark-summary-compaction 알고리즘을 사용한다.

  • Concurrent Mark & Sweep GC (CMS) - STW 시간이 매우 짧다. 다른 GC보다 메모리와 CPU를 많이 사용

  1. Inital Mark : 클래스 로더에서 가장 가까운 객체 중 살아 있는 객체만 찾고 끝냄

  2. Concurrent Mark : 방금 살아있다고 확인한 객체에서 참조하고 있는 객체들을 따라가면서 확인(다른 스레드가 실행 중인 상태에서 동시에 진행)

  3. Remark : Concurrent mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인

  4. Concurrent Sweep : 쓰레기를 정리하는 작업

  • G1(Garbage First) GC

    • 바둑판 영역 형태로 객체가 각 영역(Region)에 할당되는 형태이다. 그러다가 만약 해당 영역이 가득 차게 되면, 다른 영역에 객체를 할당하고 GC를 실행 / Java 9부터 기본 GC

    • 기존에는 Young의 Eden, Survivor, Old 이렇게 영역들이 나뉘어져서 존재하고 있었지만 G1 GC 방식을 사용하게 되면 각 Region의 상태에 따라서 Eden, Survivor, Old이 동적으로 역할을 부여해주는 방식이다.

    • Region의 역할에는 Eden, Survivor, Old 이외에도 Humongous, Available/Unused 방식이 존재한다.

      • Humongous는 Region 크기의 50%을 초과하는 큰 객체를 저장하기 위한 공간이며, GC동작이 최적으로 동작하지 않는다.

      • Available / Unused는 아직 사용되지 않은 Region을 의미한다.

    • G1 GC에서 Minor GC가 실행되면 STW가 발생하고 이를 최대한으로 줄이기 위해서 멀티스레드로 GC를 수행

      • Minor GC는 Region들 중에 GC대상 객체가 가장 많은 Region에서 수행되고, 여기서 살아남은 객체를 다른 Region으로 옮기고 빈 Region을 Available/Unused Region으로 돌리는 과정으로 수행된다.

    • G1 GC에서 Full GC

    • Inital Mark : Old Region 에 존재하는 객체들이 참조하는 Survivor Region을 찾고, 여기서 STW가 발생

    • Root Region Scan : Inital Mark에서 찾은 Survivor Region에 대한 GC 대상 객체를 찾는다.

    • Concurrent Mark : 전체 Region을 스캔해서 GC 대상 객체가 없는 Region은 이후 단계에서 제회

    • Remark : 애플리케이션을 멈추고(STW) 최종적으로 GC 대상에서 제외할 객체를 식별

    • Cleanup : 애플리케이션을 멈추고(STW) 살아있는 객체가 가장 적은 Region에서 사용하지 않는 객체를 제거한다. STW를 끝내고 빈 Region을 Freelist에 추가해서 재사용될 수 있게 한다.

    • Copy : 완전히 비워지지 않은 Region의 살아남은 객체들을 새로운 Region에 복사해서 Compaction 작업을 수행

Parallel GC vs G1 GC?

Parallel은 JVM의 기본 GC이다. 이 것의 최대 장점은 다수의 스레드를 사용한다는 점이다. 하지만 minor GC 나 full GC가 일어나게 되면 애플리케이션이 멈춘다는 것이다. 그래서 Parallel의 가장 적합한 애플리케이션은 일시 정지를 허용할 수 있고, CPU 오버헤드를 낮추기 위해 최적화된 앱에 가장 적합

G1 GC는 반대로 STW를 최대한 줄일 수 있다는 장점을 가지고 있다.

Stack Overflow : 스택에 있는 메모리가 영향을 받는 것이다. 지역변수의 값, 함수의 인자 값, 리턴하는 주소들이 영향을 받는다.

Heap Overflow : Heap Area에 존재하고 있는 메모리들이 넘쳐서 문제가 생기는 것이다. 전역변수나 다른 프로그램 데이터가 영향을 받는다.

https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html
https://d2.naver.com/helloworld/1329
https://www.betsol.com/blog/java-memory-management-for-java-virtual-machine-jvm/