cs - 자바

ttomy·2022년 12월 24일
0

jvm

java프로그램의 .class 파일이 실행되는 환경(jre)에서 프로그램의 실행에 관련된 부분이다.

jvm프로세스는 os로부터 메모리 공간을 할당받아 Runtime Data Area로 사용한다.
이 영역은 크게 heap / stack / metaSpace(구 permGen) 등으로 나뉜다. 세부적으로는 young generation, old generation / stack frame / constant pool , method information, class variable... 등으로 이뤄진다.

원시타입의 처리

jvm은 참조타입(객체)와 원시타입을 다르게 다룬다.
원시타입의 값은 null이 될 수 없다. 값을 할당하지 않는다면
해당 타입의 기본값으로 저장된다.

음수를 저장하는 방식 - Integer.MIN_VALUES

양수에 대응하는 음수는 not비트 연산을 한 후, 1을 더하는 방식으로 저장된다. 때문에 -128에 대응되는 양수가 integer에는 없다. 해당하는 1000 0000에 not연산 후, 1을 더하면 그대로 1000 0000이 되기 때문이다.
-> 오버플로

hashMap의 구현 방식 - hashCode

java에서 배열은 객체이다.

String의 저장, 불변성

private final char배열 객체로 저장된다. 하지만 jvm과 컴파일러는 이 String을 원시타입처럼 취급한다. String은 String pool이라는 테이블에 저장하고 이 인덱스를 참조한다. new 키워드로 생성을 하지 않아도 되고,(new로 생성할 경우 string pool이 아닌 heap영역에 생성한다.)
값의 복사도 참조가 아닌 전달 값의 사본으로 일어난다.(복사 한 값의 수정이 원본에 영향을 주지 않는다.)

또한 String의 char배열은 final이기에 String 객체의 값을 변경하는 것처럼 보이는 것은 사실은 새로운 인스턴스로 바뀐 것이다.
-> 이러한 불변성으로 인해 동시 스레드에서 안전하게 사용가능하다.
값이 변하지 않을 것이라는 믿음이 있기에 가지고 복잡한 처리를 할 필요가 없다.

인터닝(interning)이란?

위처럼 String이 불변객체라면 동일한 리터럴은 가진 String이 여러개 라면 메모리 낭비가 될 수 있다. 때문에 jvm에서는 클래스가 jvm에 로드되면 리터럴들은 string constant pool에 위치시켜 String의 같은 리터럴은 풀 안의 동일한 값을 참조하도록 메모리를 관리할 수 있다.
이 경우 메모리의 같은 곳을 참조하기에 비교연산도 더 빠르게 수행한다.

제네릭

'매개변수화 된 타입'이다. 컬렉션에 특정 타입만 포함되게 제한한다.

GC와 메모리 누수 가능성

가비지 컬렉션에도 불구하고 메모리 누수가 존재할 수 있다.
메모리공간은 참조된 동안에는 gc의 대상이 되지 않는다. 때문에 이후 사용되지 않음에도 참조된 후에 해당 메모리 값이 덮어쓰여지지 않는다면 지속적 메모리 낭비가 발생하게 된다.

CONFERENCE

https://www.latera.kr/blog/2019-02-09-java-string-intern/
Java Performance Fundamental - 김한도 저
자바 프로그래밍 면접 이렇게 준비한다 - 노엘 마크업

0개의 댓글