본문 바로가기
스터디

[F-lab] 1주차 정리_자바

by 책 읽는 개발자_테드 2021. 8. 17.
반응형

리턴 타입이 메서드 시그니처에 들어가지 않는 이유

자바의 리턴 타입이 시그니처라면, 오버로딩된 메서드 중에서 컴파일러가 어떤 것을 선택할지 모호한 상황이 발생할 수 있기 때문이다.

float chargePenalty( int penalty  ) { ... }
int   chargePenalty( int penalty ) { ... }

위와 같이 동일한 시그니처의 리턴 타입이 int, float로 각각 다른 메서드가 오버로딩 되어 있다고 가정하자. 그리고 아래와 같이 해당 메서드의 결과를 double 변수에 대입한다.

 

이때 int와 float는 둘 다 double로 변환될 수 있으므로, 컴파일러는 어떤 메서드를 선택해야 할지 모호해진다.

class CheckingAccountTester
{
  public static void main( String[] args )
  {
    CheckingAccount bobsAccount = new CheckingAccount();
    double result = bobsAccount.chargePenalty( 60 ); 
    //컴파일러가 오버로딩된 두 메서드 중에 어떠한 것을 선택할지 모호해진다.
  }
}

또는 아래와 같은 상황에서도 마찬가지다.

class methodTester
{
  public static void main( String[] args ){
    method1("aaa");
  }
  public void method1(String arg){...}
  public String method1(String arg){...}
}

이러한 혼란을 피하기 위해 리턴 타입은 시그니처에 포함될 수 없다.

 

출처: https://chortle.ccsu.edu/java5/Notes/chap34A/ch34A_14.html

https://stackoverflow.com/questions/13314316/why-is-the-return-type-of-method-not-included-in-the-method-signature

 

soft reference, weak reference, phantom reference는 무엇인가?

- 자바에서 사용자 코드로 GC 동작을 제어하게 해주는 클래스들

- 자바 객체의 reachability

- JDK 1.2부터 java.lang.ref 패키지에 포함

- 자바 스펙에서 java.lang.ref 패키지에 포함된 클래스에 의해 생성된 객체를 reference object라고 부름

- reference object에 의해 참조된 객체를 referent라고 부름

 

reachability

- Java 가비지 컬렉터에서 객체가 가비지 인지 판별하기 위한 개념

- 객체에 유효한 참조가 있다면 'reachable' 없으면 'unreachable'로 구별

- unreachable 객체는 가비지로 간주해 GC를 수행

 

 

아래 그림의 root set은 유효한 최초의 참조를 의미한다. 

https://d2.naver.com/helloworld/329631

JVM의 메모리 영역인 런타임 데이터 영역스체드 영역, (객체를 생성 및 보관), 메서드 영역(클래스 정보를 저장)으로 나뉜다.

https://d2.naver.com/helloworld/329631

힙에 있는 객체들의 참조 종류

1. 힙 내의 다른 객체에 의한 참조 

2. Java 스택(Java 메서드 실행 시에 사용하는 지역 변수와 파라미터들에 의한 참조)

3. 네이티브 스택(JNI[java Native Interface]에 의해 성성된 객체에 대한 참조)

4. 메서드 영역의 정적 변수에 의한 참조

 

- 1번 참조를 제외한 나머지 3개가 root set으로 reachability의 구분 기준이된다. 이러한 java.lang.ref 패키지를 사용하지 않은 일반적인 참조를 strong reference라 부른다.

- root set으로부터 시작한 참조 사슬에 속한 객체는 reachable 객체, 나머지는 unreachable 객체로 GC 대상

 

이외에도 java.lang.ref 패키지를 통해 reachable 객체를 strongly reachable, softly reachable, weakly reachable, phantomly reachable로 구별하여 GC 때의 동작을 다르게 지정할 수 있다.

 

- strongly reachable: root set으로 시작해서 어떤 reference object도 중간에 끼지 않은 상태로 참조 가능한 객체

- softly reachable: strongly reachable 객체가 아닌 객체 중에서 weak reference, phantom reference 없이 soft reference만 통과하는 참조 사슬이 하나라도 있는 객체

- weakly reachable: strongly reachable, softly reachable 객체가 아닌 객체 중에서, phantom reference 없이 weak reference만 통과하는 참조 사슬이 하나라도 있는 객체

- phantomly reachable: strongly reachable, softly reachable, weakly reachable 객체 모두 해당되지 않는 객체. finalize되었지만 아직 메모리가 회수되지 않은 상태 

- unreachable: root set으로부터 시작되는 참조 사슬로 참조되지 않는 객체

https://d2.naver.com/helloworld/329631

GC가 객체를 처리하는 순서

  1. soft references
  2. weak references
  3. 파이널라이즈
  4. phantom references
  5. 메모리 회수

SoftReference

- SoftReference 객체로만 참조된 객체(softly reachable 객체)는 힙에 남아 있는 메모리의 크기와 사용 빈도에 따라 GC 여부가 결정됨

- Oracle HotSpot VM에서는 softly reachable 객체의 GC를 조절하기 위해 JVM 옵션을 제공 (default:1000)

-XX:SoftRefLRUPolicyMSPerMB=<N>
(마지막 strong reference가 GC된 때로부터 지금까지의 시간) > (옵션 설정값 N) * (힙에 남아있는 메모리 크기)

ex) 설정값이 1000, 남은 메모리가 100MB이면 수식의 우변은 1000ms/MB * 100MB = 100,000ms = 100sec으로 

softfly reachable 객체가 100초 이상 사용되지 않으면 GC에 의해 회수 대상이 된다.

 

- softly reachable 객체를 GC하기로 결정되면 SoftReference 객체 내의 softly reachable 객체에 대한 참조가 null로 설정되고, unreachable 객체 처럼 GC에 의해 메모리가 회수됨

- 단점: 힙에 남아 있는 메모리가 많을 수록 회수 가능성이 낮아져 다른 비즈니스 로직 객체들을 위해 비워야할 힙 공간이 softly 객체에 의해 일정 부분 점유 -> 전체 메모리 사용량 GC 발생 빈도 GC 시간

 

WeakReference

- WeakReference 객체로만 참조된 객체(weakly reachable 객체)는 GC를 수행할 때마다 회수 대상이됨

- Weakly reachable객체를 GC하기로 결정되면 WeakReference 객체 내의 weakly reachable 객체에 대한 참조가 null로 설정되며, unreachable 객체 처럼 GC에 의해 메모리가 회수됨

- LRU 캐시를 구현할 때 주로 사용

 

ReferenceQueue

- SoftReference 객체, WeakReference 객체가 참조하는 참하는 객체가 GC 대상이 되면 SoftReference 객체, WeakReference 객체 내 참조는 null이 되구 SoftReference 객체, WeakReference 객체 자체는 ReferenceQueue에 enqueue됨(GC에 의해 자동 수행)

- ReferenceQueue의 poll() 메서드, romove() 메서드를 이용해 ReferenceQueue에 이들 reference object가 enqueue되었는지 확인하면 softly, weakly reachable 객체가 GC되었는지 파악할 수 있음 (이에 따라 관련된 리소스에 대한 후처리 작업 가능)

 

- PhantomReference는 객체 내부의 참조를 null로 설정하지 않고 참조된 객체를 phantomly reachable 객체로 만든 이후 ReferenceQueue에 enqueue됨 (애플리케이션이 객체의 finalize 이후에 필요한 작업들을 처리할 수 있게 됨)

 

- WeakHashMap 클래스(Java Collections 클래스,간단한 캐시 구현 용도로 자주 사용)가 ReferenceQueue, WeaReference를 사용하여 구현됨

 

PhantomReference

- finalize와 메모리 회수 사이에 관여 (softly,weakly reachable은 GC 대상 결정에 관여)

- 객체에 대한 참조가 PhantomReference만 남게 되면 해당 객체는 즉시 finalize

- 대상 객체를 참조하는 PhantomReference가 있다면 phantomly reachable로 간주하여 PhantomReference를 ReferenceQueue에 넣고 파이널라이즈 이후 작업을 애플리케이션이 수행하게 하고 메모리 회수는 지연

 

출처: https://d2.naver.com/helloworld/329631

https://medium.com/@ramtop/weak-soft-and-phantom-references-in-java-and-why-they-matter-c04bfc9dc792

 

0.2를 2진 소수로 (무한소수) 표현하면 어떤 값이 되나?

 

0.2를 2진수로 표현하는 방법은 아래와 같다.

2를 곱한 후 1.0보다 크면 1, 작으면 0을 표기한다. 이때, 1.0보다 크다면 해당 수에 -1을 하며, 1.0이 나올때까지 반복한다.

 

계산

0.2 * 2 = 0.4 ... 0

0.4 * 2 = 0.8 ... 0

0.8 * 2 = 1.6 ... 1

0.6 * 2 = 1.2 ... 1

0.2 * 2 = 0.4 ... 0

0.4 * 2 = 0.8 ... 0

0.8 * 2 = 1.6 ... 1

0.6 * 2 = 1.2 ... 1

...

위 과정이 무한히 반복된다.

0.2 = 001100110011...

더보기

컴퓨터에서 부동소수점을 표현하기 위해 가장 널리 쓰이는 표준: IEEE 754

IEEE 754의 구성 요소: 부호비트, 지수, 가수

http://tcpschool.com/java/java_datatype_floatingPointNumber
http://tcpschool.com/java/java_datatype_floatingPointNumber

 

 

출처

https://velog.io/@hyungraelee/%EC%8B%A4%EC%88%98%EC%9D%98-%EB%B6%80%EB%8F%99-%EC%86%8C%EC%88%98%EC%A0%90-%EC%A0%80%EC%9E%A5-%EB%B0%A9%EC%8B%9D   

https://ko.wikipedia.org/wiki/IEEE_754

http://tcpschool.com/java/java_datatype_floatingPointNumber

 

실습문제

https://github.com/ShimSeoungChul/god-of-java-study/tree/main/middle

더보기

 

 

가비지 컬렉션(GC)

https://scshim.tistory.com/350


GC튜닝

https://d2.naver.com/helloworld/37111 

 

JVM 최신 GC인 zgc 동작

https://sarc.io/index.php/java/2098-zgc-z-garbage-collectors 

http://cr.openjdk.java.net/~pliden/slides/ZGC-PLMeetup-2019.pdf 

 

프로그램이란 무엇인가?

1. 프로그램은 컴퓨터에서 실행하기 위해 미리 정해진 프로그래밍 언어로 작성한 문서로, 컴파일러나 인터프리터에 의해 컴퓨터에서 실행된다. 즉, 실행 명세다.

2. 프로그램은 입력을 우리가 원하는 목적을 달성할 수 있는 출력으로 변환하기 위한 절차를 기술한 문서다.

3. 프로그램은 사람들이 보기 위한 문서다. 코드를 작성할 때 기계의 입장 뿐 아니라 사람의 입장에서 어떻게 읽힐지도 잘 생각해봐야한다.

ex) 효율 vs 가독성

 

hashCode()와 equals()의 관계, 이펙티브자바 아이템 10, 11

 

 

 

반응형

댓글