HashTable과HashMap는 비슷한 특징을 가지고 있지만 조금 차이가 있다.
HashTable은HashMap과 같이 키와 값을 통해 관리.
HashMap
HashMap는 키로서 NULL값을 사용할 수 있고, 값에서도 NULL을 사용할 수 있지만 HashTable에서는 키과 값에 NULL값을 사용할 수 없다.
HashTable의 키가 되는 오브젝트는 hashCode메소드나 equals메소드를 구현할 필요가 있다.
오브젝트가 아닌 NULL값은 위의 메소드를 구현 할수 없고 키로서 사용할 수 도 없다.
HashMap은HashTable의 뒤에 작성 되어 NULL값을 키로 사용 할 수 있도록 되어 있다.
HashTable
HashTableはThread safe지만, HashMap는 Thread safe가 아니다.
Thread safe
멀티 thread 프로그래밍에서 여러 쓰레드로부터 동시에 접근이 이뤄져도 프로그램의 실행에 문제가 없음을 뜻합니다.
하나의 함수가 한쓰레드에서 호출되어 사용중일때 다른 쓰레드가 그 자원을 동시에 함께 사용하더라도 각 쓰레드에서 함수의 수행 결과가 올바로 나옵니다.
HashMap은 복수의 스레드를 이용하여 구현하면 실행 환경에 따라 *Memory Leak, *DeadLock 등의 버그가 발생 할 가능성이 있다.
HashTable과HashMap는 배열에 선형리스트를 격납하는 내부 구조로 되어 있다. 키로 지정한 값의 해쉬값을 배열의 사이즈로 나누어 배열의 인덱스로 정하고, 그 인덱스의 키값이 선형리스트로 격납되는 방식이다.
선형리스트는 다음요소의 링크를 가지고 있어 비연속적인 영역에 데이터를 격납하는게 가능하게 되어 있다.
요소를 추가하는 것으로 링크를 갈아 끼울수있지만 그 링크를 갈아 끼우는 것을 복수의 스레드에서 동시에 실행 할수 있지만, 비동기의 HashMap의 링크는 상호참조로 인해 무한 루프가 발생 하는 경우도 있다.
그래서 HashMap는 복수의 스레드로 이용 하고 싶은 경우에는 프로그래머가 동기 처리를 통해 구현 할 필요가 있다.
HashTable는 내부에서 동기처리가 가능하기 때문에 위와 같은 문제가 발생하지 않습니다.
일반적으로 동기처리가 필요하지 않은 경우 HashMap를 이용하는 것을 추천드립니다.
*Memory Leak
프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상을 말합니다.
할당된 메모리를 사용한 다음 반환하지 않고 누적이 되기때문에 메모리가 누수가 발생합니다.
자바에서 메모리 누수는 더 이상 사용되지 않는 객체가 Garbage Collection에 의해서 회수되지 않고 계속 누적되는 현상입니다.
Old 영역에 누적된 객체로 인해서 Major Garbage Collection이 계속 발생하게 되고, 프로그램의 응답속도가 늦어지다가 결국 OOM(OutOfMemory) 오류가 발생되어 프로그램이 종료됩니다.
주로 빈번한 전역변수의 선언, 리스트, 해쉬맵 같은 콜렉션에 해당하는 객체를 해제하지 않고 계속 유지하다보면 발생하게됩니다
자바 메모리 누수의 많은 원인을 정리해보면 아래와 같습니다.
- AutoBoxing 래퍼클래스의 무의미한 객체 생성
- Using Cache 캐쉬 데이터를 해제하지 않는 경우
- Closing Connections 스트림 객체를 사용하고 closing 하지 않는 경우
- Using CustomKey 맵의 키를 재정의 하지 않고 같은키로 데이터가 계속 쌓이는 경우
- Mutable Custom Key 맵의 키를 재정의 하였지만 키 값이 불변객체가 아니라 계속 변경될 경우
- Internal Data Structure 구현 오류로 인해 메모리 해제가 안될 경우
*DeadLock
멀티 쓰레드 프로그래밍에서 동기화를 통해 락을 획득하여 동일한 자원을 여러 곳에서 함부로 사용하지 못하도록 하였습니다. 하지만 두 개의 쓰레드에서 서로가 가지고 있는 락이 해제되기를 기다리는 상태가 생길 수 있으며 이러한 상태를
교착상태(deadlock)이라고 합니다. 교착상태가 되면 어떤 작업도 실행되지 못하고 서로 상대방의 작업이 끝나기만 바라는 무한정 대기 상태입니다.
HashTable과HashMap는 비슷한 특징을 가지고 있지만 조금 차이가 있다.
HashTable은HashMap과 같이 키와 값을 통해 관리.
HashMap
HashMap는 키로서 NULL값을 사용할 수 있고, 값에서도 NULL을 사용할 수 있지만 HashTable에서는 키과 값에 NULL값을 사용할 수 없다.
HashTable의 키가 되는 오브젝트는 hashCode메소드나 equals메소드를 구현할 필요가 있다.
오브젝트가 아닌 NULL값은 위의 메소드를 구현 할수 없고 키로서 사용할 수 도 없다.
HashMap은HashTable의 뒤에 작성 되어 NULL값을 키로 사용 할 수 있도록 되어 있다.
HashTable
HashTableはThread safe지만, HashMap는 Thread safe가 아니다.
Thread safe
멀티 thread 프로그래밍에서 여러 쓰레드로부터 동시에 접근이 이뤄져도 프로그램의 실행에 문제가 없음을 뜻합니다.
하나의 함수가 한쓰레드에서 호출되어 사용중일때 다른 쓰레드가 그 자원을 동시에 함께 사용하더라도 각 쓰레드에서 함수의 수행 결과가 올바로 나옵니다.
HashMap은 복수의 스레드를 이용하여 구현하면 실행 환경에 따라 *Memory Leak, *DeadLock 등의 버그가 발생 할 가능성이 있다.
HashTable과HashMap는 배열에 선형리스트를 격납하는 내부 구조로 되어 있다. 키로 지정한 값의 해쉬값을 배열의 사이즈로 나누어 배열의 인덱스로 정하고, 그 인덱스의 키값이 선형리스트로 격납되는 방식이다.
선형리스트는 다음요소의 링크를 가지고 있어 비연속적인 영역에 데이터를 격납하는게 가능하게 되어 있다.
요소를 추가하는 것으로 링크를 갈아 끼울수있지만 그 링크를 갈아 끼우는 것을 복수의 스레드에서 동시에 실행 할수 있지만, 비동기의 HashMap의 링크는 상호참조로 인해 무한 루프가 발생 하는 경우도 있다.
그래서 HashMap는 복수의 스레드로 이용 하고 싶은 경우에는 프로그래머가 동기 처리를 통해 구현 할 필요가 있다.
HashTable는 내부에서 동기처리가 가능하기 때문에 위와 같은 문제가 발생하지 않습니다.
일반적으로 동기처리가 필요하지 않은 경우 HashMap를 이용하는 것을 추천드립니다.
*Memory Leak
프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상을 말합니다.
할당된 메모리를 사용한 다음 반환하지 않고 누적이 되기때문에 메모리가 누수가 발생합니다.
자바에서 메모리 누수는 더 이상 사용되지 않는 객체가 Garbage Collection에 의해서 회수되지 않고 계속 누적되는 현상입니다.
Old 영역에 누적된 객체로 인해서 Major Garbage Collection이 계속 발생하게 되고, 프로그램의 응답속도가 늦어지다가 결국 OOM(OutOfMemory) 오류가 발생되어 프로그램이 종료됩니다.
주로 빈번한 전역변수의 선언, 리스트, 해쉬맵 같은 콜렉션에 해당하는 객체를 해제하지 않고 계속 유지하다보면 발생하게됩니다
자바 메모리 누수의 많은 원인을 정리해보면 아래와 같습니다.
- AutoBoxing 래퍼클래스의 무의미한 객체 생성
- Using Cache 캐쉬 데이터를 해제하지 않는 경우
- Closing Connections 스트림 객체를 사용하고 closing 하지 않는 경우
- Using CustomKey 맵의 키를 재정의 하지 않고 같은키로 데이터가 계속 쌓이는 경우
- Mutable Custom Key 맵의 키를 재정의 하였지만 키 값이 불변객체가 아니라 계속 변경될 경우
- Internal Data Structure 구현 오류로 인해 메모리 해제가 안될 경우
*DeadLock
멀티 쓰레드 프로그래밍에서 동기화를 통해 락을 획득하여 동일한 자원을 여러 곳에서 함부로 사용하지 못하도록 하였습니다. 하지만 두 개의 쓰레드에서 서로가 가지고 있는 락이 해제되기를 기다리는 상태가 생길 수 있으며 이러한 상태를
교착상태(deadlock)이라고 합니다. 교착상태가 되면 어떤 작업도 실행되지 못하고 서로 상대방의 작업이 끝나기만 바라는 무한정 대기 상태입니다.