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, 등으로 이뤄진다.
- 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
'개발 일지 > 주간 개발 일지' 카테고리의 다른 글
[06월 5주차] 반응형 객체 만드는 방법(ref, reactive), Postman 에서 만든 API 공유하는 방법(export) (0) | 2023.07.01 |
---|---|
[06월 4주차] 프론트엔드 element plus 사용 방법 (0) | 2023.06.24 |
[05월 3주차] querydsl JOIN 방법 (0) | 2023.05.15 |
[05월 2주차] Vue.js 3 modal(모달, 팝업) 창 띄우기 (0) | 2023.05.13 |
[05월 1주차] 프론트엔드 에러 해결 및 querydsl -BooleanExpression을 활용한 리팩토링 (0) | 2023.05.06 |