JDK 8에서 Perm 영역이 삭제된 이유
·
💻 Dev/Java & OOP
JDK 8부터 자바는 기존의 PermGen(Permanent Generation) 영역을 제거하고, Native Memory를 사용하는 Metaspace를 도입했다. PermGen이란?PermGen(이하 Perm) 영역은 JDK 7까지 존재했던 메모리 영역으로, 클래스 메타데이터와 런타임 중에 읽힌 클래스 및 메서드 정보 등을 저장하는 공간이었다. Perm에 저장되는 데이터클래스 메타데이터(클래스 이름, 메서드 이름, 필드 이름 등)런타임 상수(Constant Pool)Static 변수(JDK 8 이전)메서드와 바이트코드 Perm 영역은 힙(Heap) 외부에 위치하며, JVM 실행 시 크기가 고정된다. 하지만 이 고정된 크기는 메모리 부족 문제를 자주 일으켰다. 동적으로 클래스들이 로드되고 Static ..
가비지 컬렉터(GC) feat.힙 영역
·
💻 Dev/Java & OOP
Heap 영역가비지 컬렉터(GC)를 이해하기 전에 먼저 힙 영역에 대한 이해가 필요하다.Heap 영역의 역할자바의 힙 영역은 JVM 메모리 구조에서 가장 중요한 부분 중 하나로, 크게 세 가지 주요 역할을 한다. 1. 객체 저장 공간자바의 객체와 배열(Array)과 같은 참조 타입 변수는 힙영역에 저장된다.힙 영역에 저장된 데이터는 스택(Stack) 영역에 있는 참조 변수(reference value)를 통해 접근할 수 있다. 2. 동적 메모리 할당프로그램 시작 시에 한 번에 전체 메모리가 할당되는 것이 아니라, 객체가 실제로 필요할 때 동적으로 메모리가 할당된다.class Main { public static void main(String[] args) { // 여기서 person은 ..
자바는 Call by Value만 사용한다.
·
💻 Dev/Java & OOP
프로그래밍을 하다 보면 Call by Value / Call by Reference 개념을 배우게 된다.특히 C언어에서 포인터 할 때 고통받았던 기억이... 옛날에 자바 공부할 때는 어디서는 Call by Reference도 사용한다고 봤다..!결론만 보자면 자바는 Call by Value만 사용한다. Call by Value기본 데이터 타입Call by Value란 값에 의한 호출을 의미한다.메서드 호출 시 전달되는 값의 복사본이 메서드로 전달된다는 뜻이다.public class CallByValueExample { public static void main(String[] args) { int original = 5; modify(original); Sys..
String Constant Pool, feat. Runtime Constant Pool
·
💻 Dev/Java & OOP
String str = "hello";String str2 = "hello";System.out.println(str == str2); // true위 코드에서 str == str2의 결과는 뭘까?동등성과 동일성을 배웠다면 false로 예상했겠지만 결과는 true다. "어라 자바에서 객체는 ==이 아니라 .equals()로 비교해야 문자열 비교가 되는 거 아니었나?"그 이유는 JVM이 String Pool을 사용하기 때문이다. String Constant Pool이란?우선 Contant Pool이란 클래스 내에 사용되는 상수들을 담아놓은공간이다.클래스 파일(.class)안에 테이블 형태로 들어가 있다. 이 Constant Pool에서 문자열 리터럴만을 별도로 관리하는 공간이 String Pool(Stri..
BigDecimal이란?
·
💻 Dev/Java & OOP
자바의 신 11장을 학습하다가 대부분 java docs 사용법? 에 대한 내용이라 어떤 걸 정리해야 할지 몰라'직접해 봅시다'파트에 BigDecimal API를 열어보라고 하길래 알아보고자 했다.결제나 큰 숫자 다룰 때 사용한다고 들어서 중요하구나~라고 듣기만 했다. BigDecimal이란?java.math 패키지에 속한 클래스로 정밀한 숫자 연산에 사용된다.주로 금융이나 과학 계산 등에서 부동 소수점 연산의 오차를 방지하고 정확한 결과를 얻고자 할 때 사용된다. 부동 소수점 연산의 오차란?public class Main { public static void main(String[] args) { double a = 0.1; double b = 0.2; doub..
Immutable(불변성), StringBuffer와 StringBuilder
·
💻 Dev/Java & OOP
String str = "Hello";System.out.println("String 객체의 주소 : "+str.hashCode());str = str + " World";System.out.println("String 객체의 주소 : "+str.hashCode()); 리터럴로 선언한 문자열 객체의 주소를 출력하고, 문자열만 더한 다음 객체 주소를 다시 출력해 보는 코드이다. 다시 변수를 만든 것도 아닌데 주소가 같지 않을까?String 객체의 주소 : 3541040String 객체의 주소 : 1758230625하지만 아니다. 왜일까?자바에서 String 객체는 기존 객체를 재사용하지 않는다, 같은 객체에 더한다고 해도 새로운 객체가 생성되고 기존 객체는 GC의 대상이 된다.즉, String 클래스는 I..