Flamme Dev
  • IntroduceMyself
  • GOAL
    • 2021년 목표
    • 회고록
      • 2020년
  • COMMON
    • 자료구조
      • 시간복잡도
      • 스택/큐
    • 코드리뷰/스터디/세미나
      • Semina
        • Version control -1 (SVN/GIT)
        • Version control - 2 (GIT)
        • PostMan
        • JMeter
      • 스터디
        • 2021년
          • EffectiveKotlin
          • 이펙티브자바
        • 2020년
          • JPA Study
            • Chap1
            • Chap3
            • Chap4
            • Chap5
            • Chap6
            • Chap7
            • Chap8
            • Chap9
            • Chap10 -1
            • Chap10-2
            • Chap10-3
            • Chap12
            • Chap 13. 웹 애플리케이션과 영속성 관리
            • Chap14
      • 코드리뷰
        • Page 1
        • 개발 생각
        • APNs 라이브러리 교체
        • 파일 삭제 분투기
        • 신입 코드리뷰
          • 2020-09-02
          • 2020-09-03
          • 2020-09-10
        • Repository
          • Repositroy(20201124)
          • Repositroy(20201123)
          • Repositroy(20201120)
          • Repositroy(20201119)
          • Repositroy(20201117)
    • 개발 서적 / 동영상 강의
      • 동영상 강의
        • 진행 중
        • 완주한 것
      • 개발 서적
        • 읽은 것
          • 손에 잡히는 10분 SQL
            • 인덱스
            • 정리 본
        • 진행 중
          • 폴리글랏 프로그래밍
          • DDD-START
            • Chapter5 리포지터리의 조회 기능
            • Chapter4 리포지터리와 모델 구현
            • Chapter3 애그리거트
            • Chapter2 아키텍쳐 개요
            • Chapter1 도메인 모델의 시작
  • INFO
    • 유스콘 준비
    • intellij
      • Command line is too long.
    • 프로그래밍의 종류
      • Async Await
      • Reactive Programming
      • Imperative Programming
      • Functional Programming
        • Naver D2 함수형 프로그래밍 강의
      • Object Oriented Programing
        • 객체지향에 대해서 알아보는 영상
      • ProcedureOriented Programming
      • RX(ReactiveX)
      • OOP VS FP
      • Declarative Programming
    • Language
      • Kotlin
        • 박재성님 강의
        • Kotlin Spring CGLIB Error
        • Kotlin의 사용
        • coroutine
        • Kotlin JVM
      • JavaScript
      • JAVA
        • DefaultNonnull
        • effective78
        • Exception
        • JsonUnWrappers
        • 명명짓기
        • @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
        • Enc Key
        • ServiceLoader
        • Annotation
        • JVM(Java Virtual Machine)
        • Java8
          • Functional 사용
          • Optional
          • Invalid Key size
        • Java13
          • Text Block
        • Basic
          • Generic
          • JVM
          • Interface, Implements
    • Framework
      • NodeJs
      • Xamarin
      • Vert.x
        • vert.x in action
        • eventbus
      • blockedthreadchecker
      • Why.. not root run..
      • Spring
        • Spring Test
        • Kotlin
        • ControllerAdvice 정리
        • JsonAnnotation
        • Spring Data R2DBC
        • SpringWebFlux
          • login
          • SpringWebFlux란?
        • JPA
          • QueryDSL 객체 주소값 확인할 것
          • SpringData-JPA에서 Save, SaveAll
          • @CompositeKey에 ManyToOne JoinColumn이 있을 경우
          • QueryDSL N+1 문제(@OneToOne)
          • QueryDSL설정
          • CreationTimestamp
          • Enum(@enumerated vs @convert)
        • SpringSecurity
          • aopAlliance
          • csrf 방어
          • antMatcher vs mvcMatcher
          • SpringSecurity를 왜 써야할까?
          • CoreSpringSecurity
            • AuthenticationProvider
            • AuthenticationManager
            • Authentication Flow
            • SecurityContextPersistenceFilter
            • SecurityContextHolder, SecurityContext
            • Authentication
            • 필터 초기화와 다중 보안 설정
            • DelegatingProxyChain, FilterChainProxy
            • 사이트 간 요청 위조 - CSRF, CsrfFilter
            • 예외 처리 및 요청 캐시 필터 : ExceptionTranslationFilter, RequestCacheAwareFilter
            • 인가 API - 권한 설정 및 표현식
            • SessionManagementFilter, ConcurrentSessionFilter
            • 동시 세션 제어 / 세션고정보호/ 세션 정책
            • AnonymousAuthenticationFilter
            • RememberMeAutheticationFilter
            • Logout,LogoutFilter
            • UsernamePasswordAuthenticationFilter
            • Form인증
            • 인증 API - 사용자 정의 보안 기능 구현
            • 인증 API - 스프링 시큐리티 의존성 추가
        • SpringMVC
          • Spring Bean Q&A
          • HttpServletRequest
          • @ControllerAdvice
          • Service와 ServiceImpl은 꼭 있어야할까?
          • SpringMVC-1
          • SpringMVC - validator와 Errors
          • SpringMVC - DispatcherServlet의 URL
          • Spring MVC - 기본설정(2) 및 HandlerInterceptor
          • SpringMVC-3
          • Spring MVC - ViewResolver
          • Spring MVC - XML/JSON
          • Spring MVC - Field Injection & Constructor Injection
        • SpringEtc
          • Transactional
          • @Atowired NullPointer
          • CircleReference
          • Mybatis
            • IBatis - sql에 Map
            • 1:1 Mapping시 Null
            • auto_Increment, selectKey
          • @Transactional
          • JacksonAnnotation
        • SpringAOP
        • SpringDI
    • Server
      • PM2
      • Tomcat
        • jks
        • Virtual Host(Port)
    • OS
      • Window
        • Active directory
      • IOS
      • Linux
        • samba/keroberos
        • Linux
          • unlimit / socket backLog
          • nohup
          • ; , & , &&, {}
          • 쉘
          • rc.local
          • ps aux | grep 프로세스이름
          • Vim
          • Su, Sudo
          • File Directory
        • IdConfig
        • 유용한 커맨드
        • 리눅스 대소문자
        • 소프트링크와 하드링크의 차이
        • ln -Tfs
        • //와 / 의 차이
        • Linux(202003)
          • rm
          • diff
          • cp
          • mv
          • tar 압축 시 어떻게 심볼릭 링크도 같이 압축할까?
          • tar 명령어
          • ln -s 심볼릭 링크
    • Network
      • API Architectural Styles
      • 포트 확인
      • HeartBeat Protocol
      • SSO(Single Sign On)
      • Cookie and Session
      • Tcp HandShake
      • WireShark
        • WireShark 옵션
        • WireShark 패킷분석
    • DataBase
      • DB락에 대해서 알아보기
      • Redis
      • MYSQL
        • Mysql TimeOut 설정
        • MysqlLog
        • SlowQuery Analyzing
        • PushNotification Stress Test
      • MSSQL
      • 데이터베이스 식별자 선택 전략
    • ETC
      • 이름 짓기
      • FFProbe
      • Talk
      • Untitled
Powered by GitBook
On this page
  • 좀 더 자세한 JVM의 원리를 알아보자. 기원알아보는게 좋다고한다.
  • JVM이란 ?
  • JVM 의 구조
  • JVM 의 실행 순서
  • JRE 실행 시 JVM Runtime Data Area 적재
  • Method 호출
  • Garbage Collection 이란?

Was this helpful?

  1. INFO
  2. Language
  3. JAVA

JVM(Java Virtual Machine)

2021-01-22

PreviousAnnotationNextJava8

Last updated 4 years ago

Was this helpful?

좀 더 자세한 JVM의 원리를 알아보자. 기원알아보는게 좋다고한다.

JVM이란 ?

JRE(Java Runtime Environment)에서 실행되어 컴파일 된 Java ByteCode를 실행시켜주는 가상머신

JRE 이란?

JVM 의 구조

PC register : Thread 명령과 address 저장

Native Method Stack : Java 외 작성된 코드를 저장하기 위한 영역 (C/C++)

JVM 의 실행 순서

JRE 실행 시 JVM Runtime Data Area 적재

  1. 자바 컴파일러가 .Java 파일을 컴파일하면 .class 파일이 생성된다.

  2. .class 파일들은 Class Loader를 통하여 Runtime Data Area 형태로 메모리에 적재 된다.

    1. Runtime Data Area는 Class Loader에서 통하여 적재 Class 저장소이다.

  3. Class에 있는 Method 및 Class Variable은 Method Area에 들어가게 된다.

    1. Method인 경우 class -> library -> class path 순으로 찾아서 검증되어 검증 완료되면 Method Area로 들어가게 된다.

    2. Class Variable는 Reference Variable 만 저장되고 그 후 Heap에 선언되는 instance Variable의 연결고리가 된다.

Method 호출

  1. Thread가 할당되면 Stack Area는 각 Thread 마다 하나씩 존재하게 된다.

  2. 해당 Thread에서 Method가 호출할 때마다 Stack Area에 쌓이게 된다.

    1. Method 안의 basic type variable는 Stack Area에 직접 값을 가지게 된다.

    2. primitive type variable는 Heap Area나 Method Area에 값을 가지게 된다.

  3. 이렇게 쌓여진 Method는 끝날 때 마다 하나씩 제거되며 Garbage Collection의 Mark and Sweep

    발생 시 Heap Area에 있는 객체가 Stack Area에서 참조 할 수 없는 경우에는 해당 객체를 제거.

Heap Area란 ?

JVM에서 런타임 시 동적 데이터를 저장하기 위한 영역이다. Instance Variable을 저장, Stack Area의 variable, diffrent Object field에 참조한다.

Garbage Collection의 Mark and Sweep 시에 참조하는 variable이 없을 시 해당 variable, field는 삭제됨.

Garbage Collection 이란?

사용되지 않는 오브젝트들을 삭제.

Garbage Collection은 Mark and Sweep을 하며 사용하는 Variable이나 field는 Mark하고 Mark가 안된 Variable이나 filed는 Sweep 한다. 즉 제거하는 것이다.

Garbage Collection은 Eden -> survivor1 -> survivor2 -> new -> old 으로 나뉘며 해당 순서대로 Mark and Sweep(이때 Sweep는 Minor GC가 한다.) 하며 결국 끝까지 남는 variable이나 field는 Old로 들어가버린다.

Old에 들어간 variable이나 field가 계속적 적재되면 결국은 Major GC가 해당 객체들을 다 삭제합니다.

이때 모든 Thread(GC 제외)는 정지되어 프로그램의 응답속도가 느려진다.

Eden, survivor1, survivor2, new는 Minor GC가 실행, old 는 Major GC를 실행

자바 런타임 환경(JRE, Java Runtime Environment)이란?
Logo
Memory Leaks and Java Code - DZone Javadzone.com
https://jeong-pro.tistory.com/148
Logo