
박정훈
주제:JVM구조
배운것:
!!! 이 모든 것들은 프로그램이 컴퓨터에서 실행되기 위하여 행해지는 것 들이다.
JVM


-클래스 로더가 데이터영역(RuntimeDataArea)에 .class를 배치 시킨다.
-클래스를 처음 참조할 때, 해당 클래스(.class)를 로드하고 링크하는 역할.
-클래스(.class)를 실행시키는 역할 → 기계가 실행 할 수 있게 만드는 곳


Runtime Data Area
프로그램을 구동하기 위해 OS에서 할당받는 메모리공간!!
Stack or Thread
메소드가 호출되면 이것이 실행된다!
CPU(Process)란? 단순히 실행중인 프로그램! →구글을 켰다→OS로부터 메모리공간 할당받음→그 안에 Thread가 나서서 일을 한다.! Process안에는 자원(데이터,메모리),스레드로 구성
Thread란? : 프로세스 내에서 실제로 작업을 수행하는 주체!!
Stack 영역과 === Thread 영역이 같은 말이다!! 이 Thread안에!! PC,jvm stack 이있다.
PC,JVM stack은 쓰레드별로 생성이 되고 1개씩, Heap과 Method Area는 공유되어 사용 된다.
현재 실행할 주소값을 저장하는 레지스터
Scope : 함수내에 변수에 대한 접근이 어떻게 되는지를 나타내는 용어.
변수에 접근할 수 있는 범위
****Block Scope****: 블록 외부에서 내부로 접근할 수 없다는 뜻
https://javari492.tistory.com/m/108
if(true){
let hi = "hi";
}
let hi = "hello";
--------------------------------------------------------
if (true) {
let hi = "hi";
}
hi = "hello";
console.log(hi) //hi
AutoBoxing:
기본타입(int,long,double등)같은 타입을 WrapperClass(Interger,Long,Double 등)객체로 자동 형변환해주는 것.
int n1 = 10; →(AutoBoxing) Integer a1 = n1;
Unboxing:
Wrapper class 객체 타입을 기본타입으로 형변환 해주는 것.
Integer a1 = Interger.valueOf(10); →(Unboxing) int b1 = a1
Example
int num = 10;
ArrayList<Integer> list = new ArrayList<>();
list.add(num);
ArrayList에서 요소를 가져올 때도 마찬가지입니다. Integer는 int로 자동 변환됩니다.
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
int num = list.get(0);
| Primitive type | Wrapper class |
|---|---|
| boolean | Boolean |
| byte | Byte |
| char | Character |
| float | Float |
| int | Integer |
| long | Long |
| short | Short |
| double | Double |
| 단순자료형 | 객체타입자료형 |
CallByValue: 함수 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달함. 이때 복사된 인자는 함수 안에서 지역적으로 사용되기 때문에 local value 속성을 가짐. 따라서, 함수 안에서 인자 값이 변경되더라도, 외부 변수 값은 변경안됨
CallByReference: 함수 호출 시 인자로 전달되는 변수의 참조값을 전달함
따라서 함수 안에서 인자 값이 변경되면, 아규먼트로 전달된 객체의 값도 변경됨
자바의 경우, 항상 call by value 로 값을 넘긴다.
JAVA에서 Call by reference는 해당 객체의 주소값을 직접 넘기는 게 아닌 객체를 보는 또 다른 주소값을 만들어서 넘기다는 사실을 기억
| Mutable | Immutable |
|---|---|
| 생성된 이후 수정 가능 | 생성된 이후 수정 불가능 |
| 이미 존재하는 객체에 재할당(값 변경) | 이미 존재하는 객체이더라도 새로운 객체를 생성하여 재할당 |
| 값을 변경할 수 있는 메소드 제공 | 값을 변경할 수 있는 메소드 제공 x |
| Mutable class일 경우 Getter와 Setter 존재 | Immutable class일 경우 Getter와 Setter 미존재 |
| thread safe하지 않을 수 있음(병렬처리 시 값 보장할 수 없게 됨) | thread safe(병렬처리 시 문제 없음) |
| StringBuffer, StringBuilder, java.util.Date 등이 해당 | Legacy classes, Wrapper classes, String class 등이 해당 |
정리하면 Mutable은 객체의 수정을 허용하나, Immutable인 경우 객체의 수정을 허용하지 않는다. 수정이 필요할 경우 Mutable 객체는 기존의 객체에 수정사항을 곧바로 반영한다. 하지만 Immutable 객체의 경우 기존의 객체는 그대로 두고 수정사항을 반영한 새로운 객체를 생성한다는 점에서 차이가 있다.
Mutable 속성 확인
public class Mutable {
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abc");
System.out.println(stringBuilder);//abc
System.out.println(System.identityHashCode(stringBuilder));
//1785210046
stringBuilder.append("def");
System.out.println(stringBuilder); //abcdef
System.out.println(System.identityHashCode(stringBuilder));
} //1785210046
}
Immutable 속성 확인
public class Immutable {
public static void main(String[] args) {
String str = "abc";
System.out.println(str); //abc
System.out.println(System.identityHashCode(str));
//1785210046
str += "def";
System.out.println(str); //abcdef
System.out.println(System.identityHashCode(str));
//1151020327
}
}
Setter 메소드 제거
궁금한 것: JIT방식 인터프리터로 실행하다가 → 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 더이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식?..?
CallbyReference 랑 CallbyValue 아직 잘 모르겠다!!!!!!

32비트는 0101같은 숫자가 32개 있는 것
hdd.sdd→program실행되지 않은 것 - > process실행되고 있는 프로그램 → cpu pc에서 주소값을 가져다 사용함
ALU산술연산장치:더하기 빼기 하는 곳
CallByReference

