Post

2021-02-15-TIL

2021-02-15-TIL

The history of Java

자바는 처음에 Write Once, Run Anywhere이라는 모토로 가전제품용으로 개발했지만, 그 당시에 임베디드 시스템에 복잡한 로직은 필요없었으므로 실패하게 되었다. 그리고 웹이 발전하면서 자바는 클라이언트에서 실행되는 애플리케이션인 자바 애플릿으로 유명해졌다. 때문에 현재는 다양한 환경에서 자바가 사용되고 있다.

JVM(Java Virtual Machine)

모든 자바 개발자들이 바이트 코드가 JRE(Java Runtime Environment)에 의해 실행된다는 것은 알고 있다. 하지만 대다수가 JRE는 JVM의 구현이라는 사실을 모른다. JVM은 바이트 코드를 분석하고, 코드를 해석하며, 실행한다. 우리가 JVM의 아키텍처를 안다는 것, 그것은 개발자로서 매우 중요하다. 왜냐하면 그것을 앎으로써 우리는 코드를 좀 더 효율적으로 작성할 수 있기 때문이다.

가상 머신은 물리적 머신의 소프트웨어 구현이다. 마찬가지로 JVM은 자바 프로그램을 컴퓨터가 실행하도록 해주는 소프트웨어 구현 또는 가상 머신이다.

JVM Architecture

JVM Architecture Diagram

[source] : https://dzone.com/articles/jvm-architecture-explained

자바파일을 컴파일하면 자바 바이트코드가 포함된 클래스파일이 생성된다.

클래스 로더가 클래스파일을 메모리에 로딩한다.

Native method library로 C로 작성된 라이브러리들을 불러올 수 있다.

Inner class와 외부 2개의 클래스 생성

클래스파일을 클래스 로더가 메모리에 로드하고, 그 로드된 데이터를 읽으면서 엑시큐션 엔진이 실행한다.

동적으로 로딩 가능한데, C언어의 dynamic linking과 유사

FQCN 은 클래스패스

힙에는 객체가 들어가고 스택에는 지역변수와 메서드 상태가 저장된다.

PC는 CPU의 프로그램 카운터같은걸 메모리에 만들어놓은 건가요?

클래스 이름 필드 관계 등 정보가 메서드 에어리어에 들어간다.

스태틱변수는 링커에의해서 링킹과정에 초기화된다. static int age = 25; 라면 0으로 일단 초기화 된다. init단계에서 25가 저장된다.

생성자는 힙에 객체가 할당될때 생성된다. 스태틱은 클래스로더가

클래스를 동적으로 로딩해주기 때문에 Hell의 static블록은 static이라도 로딩하지 않는다. 필요할 때 로딩한다.

메서드 영역에 다 넣는데 메서드 영역이라 하는지 모르지만, 이상한건 다 메서드영역에 들어간다.

new로 만드는 것들 enum은 힙영역에 들어감

스레드는 개별적인 스택영역을 가지는데 이를통해서 개별 메서드를 실행할수있다. 그리고 이를 문맥교환하기위햇 PC가 스레드별 PC를 가진다.

매번 인터프리터가 바이트코드를 번역하지 않아도 되어서 JIT덕분에 성능이 엄청 좋아졌다. 바이트코드를 실행시간에 기계어로 번역해준다.

바이트코드도 메서드영역에 들어있따.

스태틱 변수는 클래스로더가 로딩할때 메서드영역에 저장된다.

인스턴스변수는 힙에 저장된다. new를 만났을때

리터럴은 메서드영역에

자바의 참조 타입이 왜 없는가?

https://anturis.com/blog/java-virtual-machine-the-essential-guide/

https://www.geeksforgeeks.org/jvm-works-jvm-architecture/

https://dzone.com/articles/jvm-architecture-explained

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

Q) 테스트 코드에서 메인 코드의 메서드에 접근하려면 메인의 메서드가 public이거나 package-private 이어야 하는 것 같습니다. 하지만 private인 상태로 테스트 코드에서 실행할 방법은 없는건가요? 테스트 코드 때문에 접근제한자가 달라진다면 테스트 코드가 메인 코드에 영향을 끼치는 문제가 발생하는 것이 아닌가요?

A) 가장 중요한 것은 그 시점에 해당 메서드를 테스트할 필요가 있는가? 라는 나름의 결론을 내었습니다.

https://blog.benelog.net/2685835.html

https://www.slipp.net/questions/253

AssertThat vs AssertEquals

https://jongmin92.github.io/2020/03/31/Java/use-assertthat/

Type of Reference

https://www.geeksforgeeks.org/types-references-java/

Call by Value and Call by Reference in Java

https://www.javatpoint.com/call-by-value-and-call-by-reference-in-java

https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5

https://kldp.org/node/155101

https://lion-king.tistory.com/entry/Java-JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%EB%B3%80%EC%88%98-%EC%A0%81%EC%9E%AC-%EC%9C%84%EC%B9%98?category=854172

https://gcc.gnu.org/legacy-ml/gcc/2000-05/msg00293.html

This post is licensed under CC BY 4.0 by the author.