🐯
경민민 IT 핸드북
  • Orientation
    • 전달사항
    • 복습방법
    • 수료한 선배의 한마디
    • 간단 자기소개
    • 스터디
  • 백엔드
    • Java
      • 1장 프로그래밍 기초
      • 2장 자바 메모리구조
        • 1. Stack
        • 2. Heap
      • 6장 객체
      • 8장 상속
      • 9장 다형성
      • 10장 추상클래스와 인터페이스
      • 13장 Generic
      • 14장 Thread
      • 15장 Network
      • 16장 Lamda
        • 1. 내부 클래스 (Inner Class)
          • DTO , VO, Builder Pattern
        • 2. 람다 표현식 (Lambda Expression)
        • 3. 스트림 API (Stream API)
          • Optional
      • 17장 Enum
  • 프론트
    • Node.js
    • Java Script
      • ES6+
        • Node.js로 자바스크립트 실행
        • let , const , var
        • Destructuring문법
          • Rest(...) 문법
        • Arrow Function
        • 모듈
        • ETC
    • Type Script
      • 개요
      • TS설치 및 환경설정
      • 타입스크립트 기본
        • 기본 자료형들과 타입추론
        • Object, Array , Tuple
        • Any, Unknown, Union Type
        • Function Type
          • Type Assertion && Narrowing
          • Never type
        • Type Aliases와 Interface
        • 리터럴 타입
        • 함수 추가 문법
        • Class문법
        • 객체 타입 추가 문법
        • 실습문제 1차
        • 실습문제 2차
        • 실습문제 3차
    • React
      • 개요
      • SPA 와 MPA
        • SEO(작성예정)
      • 리액트 프로젝트 생성(18.3.1.ver)
        • HTML + react 샘플
        • CRA 와 Vite 비교
      • 리액트 개념들
        • Component
          • 클래스 컴포넌트(작성예정)
          • 함수형 컴포넌트(작성예정)
        • JSX
        • React Virtual Dom
          • Reconciliation
        • hook
          • useState
        • 리액트 데이터 전달
          • FLUX
      • 백엔드 서버 연동
        • 비동기요청
        • 웹소켓
        • Promise(작성예정)
      • 실습문제 1
      • 실습문제 2
      • 실습문제3
      • 실습문제4
  • 프레임워크
    • Spring
      • Spring 개발환경 구축
        • 프로젝트 환경설정
        • 프로젝트 생성
          • MVC Project 생성이슈
        • Maven 설정
        • web.xml 설정
        • Spring Bean Configuration.xml 설정
      • Spring Legacy Project
        • Spring 요청 및 응답 흐름
        • Spring 주요 Annotation
          • 의존성 주입방식의 차이점
          • @ModelAttribute와 유효성검사
          • 비동기처리
          • 스프링 예외처리
        • Logging
        • Pagination
        • Spring File 업로드 및 다운로드
        • Spring WebSocket
        • Spring AOP
      • Spring 라이브러리들(작성예정)
        • Lombok
        • Maven
        • MyBatis
      • Spring 구성 모듈(작성예정)
      • 스프링 과제
    • Spring Boot
      • Spring Boot 개발환경 구축
      • 스프링 부트 프로젝트 생성방법들
        • 프로젝트에서 사용하는 의존성들
      • 스프링 프로젝트 구조
        • SpringBootApplication
      • application.properties
      • Cross Origin
        • CORS
      • WebSocket
        • Stomp(작성중)
      • 로그인(작성중)
      • Spring Security(작성중)
      • 실습문제 Select
      • 실습문제 Update
      • 실습문제 Delete
  • 형상관리(Git)
    • GitHub설정
    • SourceTree를 활용한 깃허브 연동
      • 소스트리 설치
      • Clone
      • Branch
        • Branch Protection rules
          • Branch Protection Rules 상세규칙
        • Rebase 와 Squash (작성예정)
      • Team Project 설정
        • 팀장 프로젝트 셋팅
          • Collaborator
          • .gitignore 설정
        • 팀원 프로젝트 셋팅
        • 공통 프로젝트 진행
  • 프로젝트
    • 진행순서
      • 요구사항 분석 단계
        • 유용한 사이트
      • 프로그램 설계 단계
        • 유용한 사이트
      • 프로그램 구현단계
        • SourceTree를 활용한 Team Project설정
      • 테스트 단계
  • 배포
    • AWS-EC2 배포 연습
    • DevOps
      • IT시스템의 변화와 DevOps
      • DevOps 라이프사이클
    • 젠킨스
      • 도커
        • 도커 설치 방법
        • 도커 기본 명령어들
      • 젠킨스 설치
      • 젠킨스 프로젝트 생성
      • 젠킨스 소스코드 통합 - Github
      • 젠킨스 빌드 설정 - Maven
      • 배포 서버 구축하기
      • 파이프라인 구축
      • AWS 서버 생성
        • AWS 인스턴스 생성
        • AWS - Zenkins 연동
        • AWS - 배포서버 연동
        • AWS - Jenkins CI/CD파이프라인 구축
  • 유용한 사이트 모음
  • SQL
    • SQLD
      • 데이터 모델링의 이해 - 스키마
      • 데이터 모델링의 이해 - ERD
      • 데이터 모델링의 이해 - 정규화
      • 데이터 모델링의 이해 - NULL
      • SQL 기본 및 활용 - WINDOW FUNCTION
    • Oracle
      • 1장 개요
      • 2장 SQL
  • LLM 서비스
    • 1장 LLM에 대한 이해
    • 2장 프롬프트 엔지니어링
      • 프롬프트와 프롬프트 엔지니어링
      • GPT PlayGround
      • 프롬프트 작문 유형
      • 기본 프롬프트 엔지니어링 태크닉
      • 고급 프롬프트 엔지니어링 태크닉
        • ReAct Prompting
        • Active-Prompt
        • Reflexion
        • Graph Prompt
      • OpenAI API설정
      • OpenAI를 활용한 프롬프트 엔지니어링 실습
        • 실습 프롬프트
    • 3장 Lang Chain 프레임워크
      • LangSmith 프레임워크
        • LangSmith를 활용한 LangChain 모니터링 설정
      • LangChain 실습 1 - Prompt
        • 실습 코드
      • LangChain 실습 2 - LLM 캐시와 메모리
    • 4장 RAG
      • Document Loader - 문서 로더
      • Text Splitter - 텍스트 분할
      • Embedding - 임베딩
      • Vector Store - 벡터 저장소
      • Retriever - 검색기
      • ReRanker - 재평가자
      • RAG
Powered by GitBook
On this page
  • Intro
  • Heap ?
  • Garbage Collector
  1. 백엔드
  2. Java
  3. 2장 자바 메모리구조

2. Heap

Previous1. StackNext6장 객체

Last updated 7 months ago

Intro

Java는 멀티쓰레드를 지원하는 프로그래밍언어입니다. 만약 여러분들이 만든 어플리케이션을 100개의 쓰레드가 동시에 이용하는 상황에서 각 쓰레드에 공통적으로 필요한 데이터가 존재하는 경우를 생각해 봅시다. 이 데이터는 1000byte정도의 저장공간을 필요로 하고, 100개의 쓰레드에서 각 각 이 데이터를 생성해야하는 경우 1000 * 100 byte의 저장공간이 필요하겠네요. (만약 각 쓰레드에 필요로 하는 데이터의 양이 많아지는 경우 메모리의 크기는 기하급수적으로 늘어나서 금방 메모리가 동날것입니다.)

정말 비효율적이지 않습니까? 이런 데이터를 효율적으로 관리하려면 어떻게 해야 할까요?

쉽습니다. 필요한 데이터는 한번만 생성해 두고 데이터가 필요한 스레드가 가져다가 사용 할 수 있도록 데이터 공유환경을 만들어 두어야겠죠. Heap메모리는 이처럼 각 스레드가 필요한 데이터를 공유하여 사용하기 위한 목적으로 설계되었습니다.

그럼 이 Heap에는 어떠한 데이터들이 저장되고, 관리되는지와 어떻게 사용하고 작동하는지에 대해서 알아보도록 하겠습니다.

Heap ?

Heap 메모리 영역은 프로그래밍을 하는 과정에서 새롭게(new) 생성된 데이터를 저장하고, 이렇게 저장된 데이터는 모든 쓰레드가 접근하여 사용할 수 있습니다.

새롭게 생성되고 관리되는 데이터는 모두 참조자료형에 해당하는 값들입니다. 예시는 아래와 같습니다.

  1. new 연산자를 통해 생성된 객체

  2. 배열자료형 Array

  3. 열거형 enum

  4. 인터페이스 interface

위와 같은 참조자료형 데이터는 생성하게 되면 Heap메모리에 저장공간을 할당 받습니다. 배열데이터를 기준으로 예시를 들어보도록 하겠습니다.

  1. 배열변수 선언시 Stack에는 배열자료형을 위한 저장공간이 할당됩니다.

  2. 배열변수는 참조자료형 변수로 JVM의 버전에 따라 4/8byte의 저장공간을 가지고 있습니다.

위 구문처럼 arr = new int[3]; 과 같은 배열 생성구문을 작성하면 Heap메모리에는 배열데이터를 위한 저장공간이 할당됩니다.

  1. Heap메모리에는 배열데이터를 저장하기위한 저장공간이 할당됩니다

  2. 크기가 3인 인트자료형 배열을 선언했으므로 int값을 넣을 수 있는 저장공간도 3개 생성됩니다. 즉 heap메모리상에서 배열이 차지하는 크기는 최소 4byte *3으로 12byte가 됩니다.

  3. 생성된 배열에 접근하여 값을 꺼내 쓸때는 arr[0], arr[1]과 같은 식으로 담겨있는 데이터의 위치를 제시합니다.

생각해주셔야 하는 점은 생성된 배열데이터는 Heap메모리 저장공간에 위치하고 있으며 이 값을 저장하는 변수는 Stack메모리에 존재합니다. 그럼 Stack에서 어떤 방식으로 Heap메모리에 존재하는 배열을 호출하여 값을 조작할 수 있는 걸까요?

정답은, 배열과 같은 참조자료형변수의 경우 담고 있는 값이 리터럴이 아닌 Heap영역 내부에서 데이터가 생성된 주소값이기 때문입니다. 배열이나, 객체와 같은 데이터는 new 연산자를 통해 Heap메모리 영역에 저장공간이 할당 및 생성되며 생성완료시 해당 데이터가 위치하는 주소값을 항상 반환시켜줍니다.

따라서Stack에서는 변수에 이 주소값을 저장하여 Heap메모리영역에서 데이터가 위치한 올바른 주소로 찾아갈 수 있습니다. 여기서 끝이 아닙니다.

Heap메모리 영역에 할당된 공간은 절대 빈공간이 존재하지 않습니다. 컴퓨터의 다양한 오작동을 막기 위한 조치다 라고 이해하시면 좋은데요, 위 이미지처럼 Heap 메모리 영역에 배열 저장공간이 할당되면 배열의 0번 1번 2번 인덱스에는 해당 배열의 기본값인 숫자 0이 할당됩니다. 예시 이미지는 아래와 같습니다.

위 예시 이미지에서는 int[] 이기 때문에 기본값이 0으로 초기화 되었지만, String[]이나 기타 참조자료형 배열을 선언하는 경우 기본값은 null로 초기화 될것입니다.

Garbage Collector

Heap메모리영역은 모든 스레드에서 공유하면서 사용하는 데이터입니다. 본래 한번 Heap메모리 영역에 생성된 데이터는 개발자가 직접 제거해주지 않는 이상 알아서 삭제되거나 하지는 않습니다. 따라서 heap메모리를 직접 관리를 해줘야하는 프로그래밍언어에서는 해당 데이터가 필요 없어지는 시점에 데이터를 delete시키는 코드를 짜주셔야 하지만, Java에서는 필요 없어진 데이터들을 대신 삭제 시켜주는 Garbage Collector가 존재합니다. 따라서 Heap메모리를 크게 신경쓰지 않아도 되지만, c언어와 같이 직접 삭제하기 위해서는 사용 완료한 객체에 null값을 대입하여 가비지 컬렉터가 메모리를 수거해갈 수 있도록 작업해주시는게 중요합니다.

Mark - Sweep