CODE/JAVA1

JVM

maskan 2021. 1. 27. 15:57
public class JVM {

	public static void main(String[] args) {
		/*
		 * JVM(Java Virtual Machine)
		 * - 자바로 만들어진 프로그램이 실행되는 컴퓨터 안의 가상 컴퓨터
		 *   다른 운영체제에서도 똑같이 실행할 수 있도록 함
		 * - 운영체제 -> JVM -> 자바프로그램
		 * - 장점 : 운영체제에 상관없이 실행할 수 있다.
		 * - 단점 : 속도가 느리다.(운영체제와 직접 소통하는 것이 아니기 때문)
		 * 
		 * JVM 메모리 구조
		 * - Method Area(메서드 영역) : 클래스 멤버(static~)가 저장된다.
		 * - Call Stack(호출 스택) : 현재 호출되어있는 메서드가 저장된다
		 * - Heap : 객체가 저장된다.
		 */
		
		// 1. 프로그램 실행시 main(), classVar, classMethod()가 MethodArea에 저장됨
		// 2. 메모리에 올라가있는 메인 메소드 main()이 호출되어 CallStack에 저장됨

		System.out.println(classVar);
		// 3. System클래스의 out이 MethodArea에 저장됨
		// 4. println()이 호출되어 CallStack에 저장됨
		// 5. println()이 classVar를 출력 후 CallStack에서 삭제됨

		classMethod();
		// 6. classMethod()가 호출되어 CallStack에 저장됨
		// (메인메소드 /클래스메소드/println()의 순으로 쌓여있음
		// 7. instanceVar는 메모리에 존재하지 않기 때문에 사용할 수 없음
		// 8. println()이 호출되어 CallStack에 저장됨
		// 9. println()이 classVar를 출력후 CallStack에서 삭제됨
		// 10. classMethod()의 실행이 종료되어 CallStack 에서 삭제됨

		JVM jvm = new JVM();
		// 11. JVM객체가 Heap에 저장됨
		// 12. jvm 변수가 CallStack에 생성되고, JVM 객체의 주소가 저장됨

		System.out.println(jvm.instanceVar);
		// 13. println()이 호출되어 CallStack에 저장됨
		// 14. println()이 instanceVar를 출력 후 CallStack에서 삭제됨

		jvm.instanceMethod();
		// 15. instanceMethod()가 호출되어 CallStack에 저장됨
		// 16. println()이 호출되어 CallStack에 저장됨
		// 17. println()이 instanceVar를 출력 후 CallStack에서 삭제됨
		// 18. println()이 호출되어 CallStack에 저장됨
		// 19. println()이 ClassVar를 출력 후 CallStack에서 삭제됨
		// 20. instanceMethod()의 실행이 종료되어 CallStack에서 삭제됨

		jvm = null;
		// 21. jvm 변수에 null이 저장됨
		// 22. 어디에서도 주소를 참조하지 않는 JVM객체는 GarbageCollector에 의해 삭제됨

		// 23. main()의 실행이 종료되어 CallStack에서 삭제됨
		// 24. 프로그램이 종료되고 MethodArea의 데이터가 삭제됨
	}

	int instanceVar = 9; // 객체 생성했을 때 메모리에 올라감
	static int classVar = 2;

	void instanceMethod() {
		System.out.println(instanceVar);
		System.out.println(classVar);
	}

	static void classMethod() {// 프로그램을 실행할 때 메모리에 올라감
		System.out.println(new JVM().instanceVar); // 객체 생성ㅇ
		// System.out.println(instanceVar); 객체 생성x 아직 메모리에 올라가있지 않은 상태
		System.out.println(classVar);
	}

}

'CODE > JAVA1' 카테고리의 다른 글

ScanUtil  (0) 2021.01.27
OOP  (0) 2021.01.27
Retro Ipods  (0) 2021.01.27
ClassMaker  (0) 2021.01.27
test  (0) 2021.01.27