-
Notifications
You must be signed in to change notification settings - Fork 3
[공부] 어플리케이션 실행 중 JAR파일을 삭제하면!?
프로젝트를 하다보면 수동으로 서버를 켤 때, “java -jar name.jar”로 어플리케이션을 실행한 적이 있을 것이다.
어플리케이션이 실행 중일 때, 해당 name.jar를 삭제하면 어떻게 될까?
- 삭제 된다.
- 삭제가 안된다.
답을 알기 위해서는 JAR의 실행과 ClassLoader를 알아 볼 필요가 있다.
JAR파일은 실행 시 아래와 같은 일들이 일어난다.
- Main-Class 로드
- JAR파일의 META-INF/MANIFEST.MF 파일에는 어플리케이션 시작 시 실행할 클래스를 지정하고 있다.(보통
public static void main(String[] args)
메서드를 가진 클래스) - JVM은 이 Main-Class를 찾아 해당 클래스 파일을 메모리에 로드하고,
main
메서드를 준비한다.
- JAR파일의 META-INF/MANIFEST.MF 파일에는 어플리케이션 시작 시 실행할 클래스를 지정하고 있다.(보통
- ClassLoader 초기화
- JVM은 어플리케이션 실행 중 Class들을 로드하기위해
ClassLoader
를 초기화한다.
- JVM은 어플리케이션 실행 중 Class들을 로드하기위해
- 클래스 로딩
- Main-Class와 이 클래스가 의존하는 다른 클래스를 메모리에 로드합니다.
- 링킹
- 생략——
- 초기화
- 클래스의 정적 초기화 블럭이나, 정적 변수들 초기화
- main메서드 실행
- 위 단계들을 모두 끝내면 main메서드를 실행할 단계이다.
- 이때부터 어플리케이션 비즈니스로직이 수행된다.
ClassLoader는 JVM(Java Virtual Machine)에서 클래스를 로드하고 동적으로 런타임 시에 클래스를 메모리에 로드하는 역할을 하는 중요한 컴포넌트이다.
런타임시에 클래스를 메모리에 로드하는 역할이 왜 필요하지?
이미 jar파일에 모든 .class파일들이 있고, jar파일을 실행하면 메모리에 .class파일이 다 올라가있지 않나?
사실 그렇지 않다.
위에서 JAR파일 실행 과정을 보여준 것 처럼, main메서드를 실행할 시점에서는 아래의 요소들만 memory에 올라가 있다.
- Main-Class
- Main-Class가 의존하고 있는 클래스
- 정적 초기화 블럭, 정적 변수
그렇다. jvm은 모든 클래스를 처음부터 메모리에 올리지않고 필요할 때마다 올린다.
그러면 올리기전에는 어디에 있길래, 메모리로 들고온다는 것인가?
바로 jar파일에 있는 클래스를 참조해서 들고온다.
어플리케이션 실행 중에 jvm은 jar파일을 참조하고있다.
삭제가 안된다.
왜냐하면, ClassLoader가 동적으로 클래스를 로딩하기 위해, jar파일을 참조하고 있기 때문이다.
리눅스에서는 삭제가 될 수도있는데, UI상으로만 삭제되고 JarInputStream의 fd의 락을 계속 잡고있다고한다. UI상으로는 삭제 된 것처럼 보여도 실제로는 존재하고 락이 풀리면 실제로 반영된다고한다.
윈도우에서는 UI부터 삭제안되도록 막혀있다.
https://docs.oracle.com/javase/tutorial/deployment/jar/index.html
누누
채드
에디
- PR에 대한 단위 테스트 자동화
- 반갑개 OAuth 2.0 로그인을 해보아요
- 네트워크 통신 에러 핸들링
- Unauthorized 에러 분기 처리
- Firebase Analytics 및 Crashlytics 를 활용하여 앱 사용자 데이터 수집
- Google Play Store 배포 자동화
벼리
도도
- [문제해결]서버 스웨거 접속이 왜 안될까?
- (문제해결) AWS S3 KEY정보 없이 보안 챙기며 Spring에 연동하기
- (문제해결) MockAPI 적용해보기
- (성능개선) DB 마이그레이션 서비스 무중단으로 해보기
- (성능개선) 사용자가 많아지면, 서버 한대로 버틸 수 있을까?
- (성능개선) 사용자가 많아지면, 조회속도가 많이 느려진다.
- [공부] PUT VS PATCH
- [공부] 서버 실행 중, JAR파일을 삭제하면!?
- [[공부] classPath란?
땡이
위브
트레