Java의 참조 유형 Java에는 다양한 참조 유형이 있는데 참조 유형에 따라 가비지 컬렉터의 실행 대상 여부 및 시점이 달라진다. Strong Reference (강한 참조) 자바의 기본 참조 유형이다. Class class = new Class(); Integer i = 1; String str = "str"; ... Strong Reference의 경우 참조를 가지고 있는 한 가비지 컬렉터의 대상이 되지 않는다. (가비지 컬렉터는 참조하고 있는 객체의 경우 대상에서 제외한다.) Soft Reference (부드러운 참조) Class class = new Class(); SoftReference sRef = new SoftReference(class); class = null; class = sRef..
equals() ? equals 메서드는 두 객체를 비교하는 기능으로 Object 클래스의 메서드여서 어느 클래스를 만들던 쓸 수 있는 기능이지만 Object 클래스의 equals 메서드는 단순히 해당 객체 참조값이 같은지 비교하는 메서드 이기 때문에 좀 더 구체적인 비교를 원한다면 메서드 Overriding 하여 구현해야 한다. 하지만 곳곳에 함정이 도사리고 있어 잘못 Overriding 하게되면 프로그램이 이상하게 동작하거나 종료될 것이고, 원인이 되는 코드를 찾기도 굉장히 어렵다. Object 클래스의 equals는 비교 연산자인 == 와 같은 기능을 하는 메서드로 각 인스턴스가 본질적으로 고유한 객체를 나타내는 클래스라면 Object의 equals 메서드가 적절히 구현되어 있어 굳이 재정의 할 필..
정리가 잘 되어 있는 블로그 https://coding-factory.tistory.com/829 [Java] 가비지 컬렉션(GC, Garbage Collection) 총정리 가비지 컬렉션(Garbage Collection)이란? 가비지 컬렉션은 영어로 Garbeage Collection으로 줄여서 GC라고도 부릅니다. 가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로 coding-factory.tistory.com https://meoru-tech.tistory.com/81 💡 [CS지식] Garbage Collection에 대하여 Garbage Collection Java에선 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않아요 JVM(Java Virtu..
프로그램을 실행시키기 위해서 컴퓨터 메모리에 실행시킬 데이터와 명령어들을 저장해야 한다. 자바 프로그램 역시 운영체제(OS)가 제어하고 있는 메모리(RAM)를 사용 및 할당받을 수 있어야 하는데 JVM(Java Virtual Muchine)이 H/W, OS위에서 동작하며 메모리를 할당받고 자바프로그램을 호출하여 실행한다. Java 프로그램 실행 과정 개발자가 만든 .java 파일을 javac 명령으로 컴파일하면 .class 바이트 코드 파일이 만들어진다. 프로그램 실행하면 JVM은 OS로 부터 프로그램이 필요로 하는 메모리를 할당 받는다. 바이트 코드 파일을 Class Loader를 통해 동적으로 클래스를 로드하고 JVM 내로 로딩하여 검증 - 링크 - 초기화 과정을 거치고 Runtime Data Are..
결론적으로 두 방법을 사용하지 말라고 권장되고 있다. finalizer란 Finalizer 클래스가 있지만 document에서도 안나오고.. 사용하는 방법은 Object 클래스에 정의된 finalize 메서드를 사용하는 것. 메서드 블록안에는 아무런 기능구현이 없고 모든 객체는 Object를 상속받고 있으니 메서드 오버라이딩하여 사용하게 되는데 가비지 컬렉션 대상이 되어 객체를 없애기 전 JVM이 호출하는 메서드로 해당 객체 내에서 리소스 정리, io나 네트워크 같이 반드시 사용 후 종료가 되어야 하는 일이 필요할 때 사용하기 위해 만들어진 메서드이다. finalizer의 문제점 fanalize 메서드는 언제 실행시점이 되는지 알 수 없는 문제가 있다. 보통 Heap 메모리 영역에 Eden 메모리 공간이..
메모리 누수가 발생하는 이유 Java는 GC( = Garbage Collection)를 해주는 언어로, 다 쓴 객체를 회수해 간다. 그렇기 때문에 더 이상 메모리 관리를 하지 않아도 된다고 착각할 수 있다. // 코드 7-1 메모리 누수가 일어나는 위치는 어디인가? public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements..
같은 기능을 하는 객체는 하나를 재사용하는 방법을 고려해야 한다. Wrapper Class 자바의 wrapper class 인 Byte, Short, Integer 등 이있다. primitive type 을 wrapper class로 변환할때, new와 valueOf를 통한 인스턴스 생성이 있는데, 팩터리 메서드인 valueOf를 이용하게 되면 캐싱을 이용하여 불필요한 객체 생성을 막고 있다. public static Integer valueOf(int i) { if (i >= IntegerCache.low && i