개발 일지/주간 개발 일지

[06월 1주차] Spring VM 옵션 설정 방법, JVM 구조

계란💕 2023. 6. 5. 00:25

Spring VM 옵션 설정 방법 - IntelliJ, VS code 차이점

  • 사내에서 vs code, eclipse를 쓰는 분들도 있고 IntelliJ 를 쓰기도 한다. 
  •  vs code 에서는 빌드 관련한 설정을 위해서 .json 형태의 파일을 쓴다. ("-Dkey=value" 와 같은 데이터가 담겨 있다. )
  • 그런데, 이를 intelliJ에 적용하려면 어떻게 해야할까?

 

  • 먼저, yml 파일에 개발 버전, 배포 버전에 대한 설정 값을 다르게 설정한다. 
<hide/>
spring:
  config:
    activate:
      on-profile:
      - local
#  로컬로 실행할 경우, 설정 정보 ex) DataBase 정보 등

spring:
  config:
    activate:
      on-profile:
      - dev
#  배포할 경우, 설정 정보

 

  • 다음과 같이 intelliJ에서 구성 편집을 선택하고 창에서 "옵션 수정(M)" 버튼을 누른다. 
    • 아래 처럼 "-Dkey=value" 형태로 vm 옵션을 설정해준다. 
  • 그 다음, 필요한 상황에 따라  '='  뒤의 값만 바꾸어주면 된다. 

 


VM 옵션(VM options, VM argument)이란?

  • JVM(Java Virtual Machine)에 전달되어 VM의 동작 방식과 시스템 속성을 정의한다. 
  • System.getProperty(key)를 통해 Java 애플리케이션 안에 시스템 변수, 를 조회 가능하다. 
  • X 옵션: JVM heap memory, permanent generation, direct buffer 크기 지정 등 
  • D 옵션: 전역 시스템 속성을 정의한다. 
    • -D"Key" = value  형태로 값을 넣는다. 
    • ex) yml 파일에 개발 버전, 배포 버전에 대한 설정 값을 다르게 설정해둔다고 하면 

 


JVM (Java Virtual Machine, 자바 가상 머신)

 

  • JVM이란?
    • OS(운영 체제)와 독립적으로 CPU가 Java를 인식하고 실행하도록 하는 가상 컴퓨터를 말한다. 
    • JVM은 OS에 종속적이며(OS에 구애받지 않고 재사용 가능) Java 코드 자체가 종속적이지 않다는 뜻이다. 
    • JVM은 OS와 Java 사이의 중개자 역할이다. 
    • Java 코드(.java, 원시 코드)는 CPU가 인식할 수 없는 코드이기 때문에 인식할 수 있도록 기계어(자바 바이트 코드, java byte code,  *.class)로 컴파일해야한다. 컴파일된 바이트 코드를 읽는 주체가 JVM이다. 
    • JVM은 class loader, execution engine, runtime data area, JNI(Java Native Interface), Native Method Library, 등으로 이뤄진다. 

JVM 구조 - heap, method는 모든 스레드가 공유한다. stack, PC register, native method stack은 스레드마다 하나씩 생성한다.

 

  • Java 실행 방식
    • Java로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당한다. 
    • 컴파일러(javac): Java 코드(*.java)를 읽어서 바이트 코드(*.class)로 변환한다. 
    • 클래스 로더(class loader): class 파일을 JVM으로 로딩한다. 
    • 실행 엔진(execution engine): 로딩된 class 파일을 해석한다. 
    • Runtime data area(메모리 영역): 해석된 바이트 코드가 Runtime data area의 각 영역에 배치되어 실질적인 수행이 이뤄진다. 
      • 프로그램을 수행하기 위해 OS로부터 할당받은 메모리 공간이다. 
      • 애플리케이션을 실행할 때 사용하는 데이터들을 적재하는 영역이다.  
      • 이 과정에서 execution engine에 의해 GC(garbage collector, 더 이상 사용하지 않는 인스턴스를 찾아서 메모리에서 삭제한다.)의 작동과 스레드 동기화가 이뤄진다. 
      • 메서드 영역(method area = Class area = Static area)
        • 클래스 정보를 처음 메모리 공간에 올릴 떄 초기화되는 대상을 저장하기 위한 메모리 공간
        • static 변수, 메서드 정보, 타입 정보(class/interface 여부, super클래스 전체 이름 ) 
        • final class, 클래스 멤버 변수의 이름,  데이터 타입, 접근 제어자 같은 필드 정보 등이 생성된다. 
        • Runtime Constant Pool: 메서드 영역안에 존재한다. 
          • 상수 자료형을 저장해서 참조하고 중복을 막는 역할을 수행한다. 
      • 힙(heap): new 키워드로 생성된 객체 배열이 생성된다. 주기적으로 GC가 제거하는 영역이다. 
      • 스택(stack): 지역 변수, 파라미터, 반환 값, 연산에 사용되는 임시 값이 생성된다. 
      • PC 레지스터(PC registers): 스레드가 시작될 때마다 생성되는 영역으로 PC(Program Counter), 스레드마다 하나씩 존재한다. 
        • 스레드가 어떤 부분을 어떤 명령으로 실행해야할 지  기록하는 부분이다. 
        • 현재 스레드가 실행되는 부분의 주소명령을 저장한다. 
      • native method stacks: Java 이외의 언어(C, C++, 어셈블리 등)로 작성된 네이티브 코드(실제 실행할 수 있는 기계어)를 실행할 때 사용되는 메모리 영역으로 일반적인 C 스택을 사용한다. 

 

 

출처

https://oranthy.tistory.com/461

https://coding-factory.tistory.com/828 

 


https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80