본문 바로가기
프로그래밍/JAVA

자바 (JAVA) 힙 메모리에 관하여

by 낭만가을 2020. 12. 27.

Java 프로그래밍을 시작했을 때 Java에서 Java 힙 또는 힙 공간이 무엇인지 몰랐고 Java의 객체가 어디에서 생성되는지조차 알지 못했습니다. 전문 프로그래밍을 시작했을 때 OutOfMemoryError 오류가 발생했습니다. Tomcat 에서 Java 또는 Java Heap Space의 힙이 무엇인지 깨달았습니다. 언어를 배우는 것은 쉽지만 프로그래밍의 모든 기본을 프로그래밍의 비밀을 드러내는 경험과 작업을 가르 칠 수있는 공식적인 과정이 없기 때문에 기본을 배우는 것은 어렵 기 때문에 대부분의 프로그래머에게 발생합니다.
 
Java의 힙 공간이란 무엇입니까?
Java 프로그램이 시작되면 Java Virtual Machine이 운영 체제에서 일부 메모리를 가져옵니다. Java Virtual Machine 또는 JVM은 모든 요구 사항에 이 메모리를 사용하며 이 메모리의 일부는 Java 힙 메모리라고합니다.

Java의 힙은 일반적으로 주소 공간의 맨 아래에 있으며 위쪽으로 이동합니다. new 연산자를 사용하여 객체를 만들 때마다 또는 다른 방법으로 객체에 힙에서 메모리가 할당되고 객체가 죽거나 가비지 수집되면 메모리가 Java의 힙 공간으로 돌아갑니다.

자바의 힙 공간

자바 heap 영역

Java에서 힙 크기를 늘리는 방법
Java의 기본 힙 공간 크기는 대부분의 32 비트 Sun JVM 에서 128MB 이지만 JVM 마다 크게 다릅니다

또한 Java 1.5에서 처리량 가비지 수집기를 사용하는 경우 JVM의 기본 최대 힙 크기는 물리적 메모리 / 4이고 기본 초기 힙 크기는 물리적 메모리 / 16입니다. 

JVM의 기본 힙 크기를 찾는 또 다른 방법은 기본 힙 매개 변수로 애플리케이션을 시작하고 JDK 1.5 이상에서 사용할 수있는 JConsole을 사용하여 모니터링하는 것입니다. VMSummary 탭에서 최대 힙 크기를 볼 수 있습니다.

그건 그렇고, 애플리케이션 필요에 따라 자바 힙 공간의 크기를 늘릴 수 있으며 기본 JVM 힙 값을 사용하지 않으려면 항상 이것을 권장합니다. 애플리케이션이 크고 많은 오브젝트가 작성된 경우 JVM 옵션 -Xms 및 -Xmx를 사용하여 힙 공간의 크기를 변경할 수 있습니다.. Xms는 힙의 시작 크기를 나타내고 -Xmx는 Java에서 힙의 최대 크기를 나타냅니다.

차세대 Java 힙 공간의 크기를 나타내는 -Xmn이라는 또 다른 매개 변수가 있습니다. 유일한 것은 Java에서 동적으로 힙 크기를 변경할 수 없으며 JVM을 시작하는 동안 Java 힙 크기 매개 변수 만 제공 할 수 있다는 것입니다. Java 프로그래머가 알아야 할 10 가지 JVM 옵션 에서 Java 힙 공간 및 가비지 수집과 관련된 더 유용한 JVM 옵션을 공유했습니다 . 유용 할 수 있습니다.

자바 힙 및 가비지 수집
우리가 알고 있듯이 객체는 힙 메모리 내부에 생성되고 가비지 컬렉션은 Java 힙 공간에서 죽은 객체를 제거하고 메모리를 Java의 힙으로 되 돌리는 프로세스입니다. 가비지 수집을 위해 힙은 New Generation, Old 또는 Tenured Generation 및 Perm 공간이라는 세 가지 주요 영역으로 나뉩니다.

New Generation of Java Heap은 새로 생성 된 객체가 저장되는 Java Heap 메모리의 일부입니다. 응용 프로그램 과정에서 많은 객체가 생성되고 죽었지 만 수명이 남아있는 경우 Major 또는 Java Garbage 수집기 스레드에 의해 Old 또는 Tenured Generation으로 이동되었습니다. 전체 가비지 수집 . Java 힙의 Perm 공간은 JVM이 클래스 및 메소드, 문자열 풀 및 클래스 레벨 세부 사항에 대한 메타 데이터를 저장하는 곳입니다.

Java 힙의 OutOfMemoryError
JVM이 시작될 때 JVM 힙 공간은 -Xms 매개 변수로 지정된 힙의 초기 크기와 동일합니다. 애플리케이션 진행에 따라 더 많은 오브젝트가 작성되고 힙 공간이 새 오브젝트를 수용하도록 확장됩니다. JVM은 또한 주기적으로 가비지 수집기를 실행하여 죽은 개체에서 메모리를 회수합니다.

JVM은 -Xmx에 의해 지정된 최대 힙 크기에 가까운 곳에서 Java에서 힙을 확장하고 Java 힙에 새 개체를 만들기위한 메모리가 더 이상 남아 있지 않으면 JVM에서  OutOfMemoryError가 발생하고 응용 프로그램이 죽습니다. Java Heap에서 OutOfMemoryError No Space를 던지기 전에 JVM은 가비지 수집기를 실행하여 사용 가능한 공간을 확보하려고 시도하지만 Java의 힙에서 사용 가능한 공간이 많지 않은 경우에도 OutOfMemoryError가 발생합니다.

이 오류를 해결하려면 응용 프로그램 개체 프로필, 즉 어떤 종류의 개체를 만들고 있는지, 어떤 개체가 얼마나 많은 메모리를 사용하는지 등을 이해해야합니다. 프로파일 러 또는 힙 분석기를 사용하여 Java에서 OutOfMemoryError 문제를 해결할 수 있습니다.  OutOfMemoryError와 자바 힙 공간" 동안 Java 힙 공간이 충분하지 않고 더욱 확대 할 수 없다는 오류 메시지의 의미 : "PermGen 공간 OutOfMemoryError와" 오류 메시지가 온다 자바 힙의 영구 세대 인 경우 가득 차면 응용 프로그램이 클래스를로드 하거나 인턴 된 문자열을 할당 하지 못합니다 .

또한 고급 JVM 기술 향상에 대해 진지하게 생각하고 힙 덤프 수집 및 분석과 같은 것을 배우고 있다면  Udemy의 Java Application Performance and Memory Management 과정에 참여하는 것이 좋습니다 . 


Maven 및 ANT에서 Java 힙 공간을 늘리는 방법
클래스 수가 증가하면 빌드 도구를 처리하고 빌드하는 데 더 많은 메모리가 필요하고 종종 JVM의 힙 메모리를 변경하거나 늘리면 방지 할 수있는 OutOfMemoryError가 발생하기 때문에 Maven 또는 ANT의 힙 크기를 늘려야하는 경우가 많습니다. 자세한 내용은 Ant 또는 Maven 용 Java 힙 메모리를 늘리는 방법 내 게시물을 참조하십시오. 

자바 힙 덤프
Java 힙 덤프는 특정 시간에 Java 힙 메모리의 스냅 샷입니다. 이것은 Java 또는  OutOfMemoryError의 메모리 누수를 분석하거나 문제를 해결하는 데 매우 유용합니다. 힙 덤프를 가져 오는 데 도움이되는 도구가 JDK 내부에 있으며 자바 힙 덤프를 분석하는 데 도움이되는 힙 분석기 도구가 있습니다.

또한 " jmap" 명령을 사용 하여 Java 힙 덤프를 가져올 수 있습니다. 그러면 힙 덤프 파일이 생성되고 "jhat-Java 힙 분석 도구" 를 사용하여 해당 힙 덤프를 분석 할 수 있습니다 . Java 성능 튜닝 및 프로파일 링에 대해 자세히 알아 보려면 Scott Oaks의 Java Performance The Definitive Guide를 읽어야 합니다. 이 책은 선임 Java 개발자가 반드시 읽어야하는 Java 성능 책 중 하나입니다.
Java 힙 공간 및 메모리


자바 힙 공간에 대한 10 가지 포인트
1. Java 힙 메모리는 운영 체제에서 JVM에 할당 한 메모리의 일부입니다.

2. 객체를 생성 할 때마다 Java의 힙 내부에 생성됩니다.

3. Java 힙 공간은 가비지 콜렉션을 위해 New Generation, Old 또는 Tenured Generation 또는 Perm Space라는 세 영역 또는 세대로 나뉩니다. 영구 생성은 핫스팟 JVM에서 전체 gc 중에 가비지 수집됩니다.

4. JVM 명령 줄 옵션 -Xms , -Xmx 및 -Xmn 을 사용하여 Java 힙 공간의 크기를 늘리거나 변경할 수 있습니다 . Mega 또는 Gig를 나타 내기 위해 size를 지정한 후 "M"또는 "G"라는 단어를 추가하는 것을 잊지 마십시오. 예를 들어 java -Xmx256m HelloWorld 명령을 실행하여 Java 힙 크기를 258MB로 설정할 수 있습니다.

5. JConsole 또는 Runtime.maxMemory () , Runtime.totalMemory () , Runtime.freeMemory () 를 사용하여 Java에서 프로그래밍 방식으로 힙 크기를 쿼리 할 수 ​​있습니다. 자세한 내용은 내 게시물 Java 프로그램에서 메모리 사용량을 찾는 방법을 참조하십시오.

6. "jmap"명령을 사용하여 Java에서 힙 덤프를 가져오고 "jhat"을 사용하여 해당 힙 덤프를 분석 할 수 있습니다.

7. Java 힙 공간은 호출 계층 구조 및 로컬 변수를 저장하는 데 사용되는 스택과 다릅니다.

8. Java Garbage 수집기는 죽은 개체에서 메모리를 회수하고 Java 힙 공간으로 반환합니다.

9.  OutOfMemoryError가 발생하더라도 당황하지 마십시오., 때로는 힙 크기를 늘리는 것이 문제이지만 반복되는 경우 Java에서 메모리 누수 를 찾습니다 .

10. 프로파일 러 및 힙 덤프 분석기 도구를 사용하여 Java 힙 공간과 각 개체에 할당 된 메모리 양을 이해합니다.

 

 

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 JVM (RUNTIME DATA AREAS)  (0) 2020.04.01
[CODILITY] MINMAXDIVISION  (0) 2020.04.01
Java의 Collections (List, Set, Map) 이해  (0) 2020.03.14
Iterator 와 Enumeration 차이  (0) 2020.03.14
Hashtable, HashMap, ConcurrentHashMap 비교  (0) 2020.02.14

댓글