본문 바로가기
programming/Topic Stack

Java

by zsgg 2019. 9. 12.

Hashtable vs SynchronizedMap vs ConcurrentHashMap

alt book

ConcurrentHashMap divides the Map instance into different segments. And each thread acquires lock on each segment. By default it allows 16 threads to access it simultaneously without any external synchronization i.e. by default concurrency level is 16. We can also increase or decrease the default concurrency level while creating

Java Volatile 의미

Java volatile 키워드는 여러개의 쓰래드들 에서 사용되는 변수의 변화(값의 변화) 에 대한 가시성의 보장합니다.

atomic vs volatile vs synchronized

What is the difference between atomic / volatile / synchronized?

volatile의 경우는 하나의 스레드가 쓰기 연산을 하고, 다른 스레드에서는 읽기 연산을 통해 최신 값을 가져올 경우. 즉 다른 스레드에서는 업데이트를 행하지 않을 경우 이용할 수 있다.
Atomic*** 클래스의 경우는 여러 스레드에서 읽기 쓰기 모두 이용할 수 있다. (CAS)
synchronized 경우도 여러 스레드에서 읽기 쓰기 모두 이용할 수 있다. (Lock)

throws Throwable

alt error tree

자바의 예외처리

Effective Java

자바 언어 명세에 강제된 사항은 아니지만, 보통 Error는 JVM이 자원부족이나 프로그램을 실행할 수 엇는 상태에 도달했음을 알리기 위해 사용한다.

복구가능한 상태에서는 점검 지정예외(checked exception)를 사용하고, 프로그래밍 오류를 나타내고 싶을때는 실행지점 예외(runtime exception)를 사용하라는 것이다.

unchecked나 error는 catch로 처리할 필요가 없으며, 일반적으로 처리해서도 안된다.
프로그램이 무점검예외나 오류를 던진다는 것은 복구가 불가능한 상황에 직면했다는 뜻으로, 더 진행해 봐야 득보다 실이 더 크다는 뜻이다. 이런 throwable을 catch하지 않는 스레드는적절한 오류 메시지를 내면서 중단(halt)된다.

GC, java 메모리 구조

Java Reference와 GC
Java Garbage Collection
JAVA :: 자바의 메모리 구조 - 1. 메소드 영역(Method Area)
JAVA :: 자바 메모리 구조 - 2. 힙 영역(Heap Area)과 스택 영역(Stack Area) 비교
JVM 메모리구조
JVM 구조와 자바 런타임 메모리 구조

Class Loader

클래스파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할을 Class Loader가 한다. (자바 애플리케이션이 실행중일 때 이런 작업이 수행된다.)

Execution Engine

Class Loader에 의해 메모리에 적재된 클래스(바이트 코드)들을 기계어로 변경해 명령어 단위로 실행하는 역할

Garbage Collector

Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할

Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역

Method area

클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, Type정보(Interface인지 class인지), Constant Pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final class 변수등이 생성되는 영역
Static 변수는 Class Variable에 저장됩니다
어디서든 공유해서 쓸 수 있다는 변수를 의미합니다
Static변수는 클래스가 사용되기 전에 미리 메모리에 올라갑니다.

Heap area

인스턴스와 배열을 저장하는 영역입니다.
데이터가 동적으로 생성,소멸 된다.
JVM이 Heap영역에 메모리를 할당한다.

Stack area

지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역

PC Register

Thread(쓰레드)가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다

Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역

String

String에 대한 궁금증 4가지

new를 사용할 경우에는 무조건 새로운 객체를 생성한다.
""를 사용하면 이전에 생성한 객체가 있는지 체크하고 없을 경우에만 새로운 객체를 생성한다. 참조값이 같을 경우에는 이전에 생성한 객체를 가리킨다.

JVM의 최대 Heap 메모리가 String의 최대 길이를 결정

Java String pool Example

String pool is a pool, or else a set, of String objects located in a special place in Java Heap

every time you create a String using a literal, the system will search that pool and check if the value of the literal exists in a String object of the pool. If it does, it returns back the reference to that matching object, and if not, it creates a new String object and stores it in the pool.

But be careful. Before Java 7, this pool was located in a special place in the Java Heap, called PermGen. PermGen is of fixed size, and can only hold a limited amount of string literals. So, interning should be used with ease. From Java 7 onwards, the pool will be stored in the normal heap, like any other object (making them eligible for garbage collection), in a form of a hashmap and you can adjust its size using -XX:StringTableSize option. Having said that, you could potentially create your own String pool for that matter, but don’t bother.

상수와 리터럴

변수(variable) 하나의 값을 저장하기 위한 공간
상수(constant) 값을 한번만 저장할 수 있는 공간
리터럴(literal) 그 자체로 값을 의미하는 것

int year = 2017 ;
final int MAX_VALUE = 100 ;

변수 : year
상수 : MAX_VALUE
리터럴 : 2017, 100

동등성과 동일성

Java 의 equlas 과 hashCode, 동등성과 동일성
Effective Java 2/E - Chatper 03 모든 객체의 공통 메서드

equals 는 두 객체의 내용이 같은지, 동등성(equality) 를 비교하는 연산자

hashCode 는 두 객체가 같은 객체인지, 동일성(identity) 를 비교하는 연산자

equals 메서드 재정의 일반 규약

equals 메서드는 동치 관계(equivalence relation) 를 만족해야함

반사성(reflexive) : x.equals(x) = true

대칭성(symmetric) : x.equals(y) = true -> y.equals(x) = true

추이성(transitive) : x.equals(y) = true && y.equals(z) = true -> x.equals(z) = true

일관성(consistent) : x.equals(y) 을 여러 번 해도 -> all true

Null에 대한 비동치성(Non-nullity) : x.equals(null) = false

hashCode() 와 관련된 규약

equals() 로 비교시 두개의 오브젝트가 같다면, hashCode() 값도 같아야 한다.

equals() 로 비교시 false 라면, hashCode() 값은 다를수도, 같을수도 있다. 그러나 성능을 위해서는 hashCode() 값이 다른것이 낫다. 그래야 해싱 알고리즘으로 Set 에 해당 오브젝트가 존재하는지 아닌지 빠르게 검색할 수 있다.

hashCode() 값이 같다고 해서, eqauls() 가 true 를 리턴하는 것은 아니다. 해싱 알고리즘 자체의 문제로, 같은 해시값이 나올 수 있다.

'programming > Topic Stack' 카테고리의 다른 글

DDD  (0) 2018.11.07
Linux  (0) 2018.11.06
javascript  (0) 2018.08.11
Design Pattern  (0) 2018.08.08

댓글