-
Notifications
You must be signed in to change notification settings - Fork 10
DCEVM
KIM, Jung-gyum edited this page Feb 10, 2015
·
9 revisions
KakaoPick Server Project에 DCEVM(Dynamic Code Evolution VM) 적용하기
- HotSwap 과 DCEVM 에 대한 전반적인 개요를 파악하기에 좋은 문서로 아래의 문서들이 있다. 아래 문서의 내용을 요약하고 보완하여 정리하였다.
-
Java 1.4 에서 HotSwap 이 구현되어 공개되었다. 이 HotSwap 기능과 IDE 설정을 통합하는 방법은 몇몇 블로그에서 소개되어 있다. 그러나 이 HotSwap 은 이미 존재하는 메쏘드를 재정의(redefine)한 경우만을 지원한다. 메쏘드를 재정의하였다는 것은 메쏘드의 구현 내용을 수정하였다는 의미이다. 즉, 새로운 메쏘드를 추가하거나, 이름이 변경되는 경우 등을 지원하지 않는다.
- http://www.asjava.com/core-java/how-to-hotswap-java-code-into-jvm-redefinition-example/ ... Unfortunately, the redefinition is limited to only change the body of method — it cannot apply to add either method, fields or otherwise. but Good news from JavaOne 2010: A modification of the Java HotSpot(TM) VM that allows unlimited class redefinition at runtime will become soon, it may be a nice feature in next JDK release.
- 기존에 JRebel 이라는 유료 툴이 기본 JVM 의 HotSwap 을 보완하는 확장된 hot swap 기능을 제공하였다. JVM 수준의 HotSwap 뿐만 아니라, j2ee 컨테이너 특화된 HotSwap 기능을 대체하는 기능을 JRebel 이 제공하고 있고, 다양한 개발툴이나 프레임워크에서 쉽게 활용할 수 있도록 기술지원을 제공한다. JRebel 은 JVM 을 수정하는 방식이 아니라, 개발자가 구현하는 자바코드의 바이트코드를 항상 수정하여 Java 1.4 에서 소개된 'old HotSwap' 을 적용할 수 있게 만들어 주는 도구이다. 이 때문에, IDE 에서 코드를 디버깅하려면, 개발자가 작성한 코드와는 상당히 다른 바이트코드가 배포되었기에, 반드시 IDE 에서 변형된 바이트코드를 살펴볼 수 있는 기능을 제공해야 한다.
-
DCEVM (Dynamic Code Evolution VM)은 method 재정의 뿐만 아니라, 클래스의 필드를 수정하거나 메쏘드를 추가, 삭제한 경우, super 클래스를 변경한 경우에도 hot swap 을 지원하게 된다. DCEVM 은 Thomas Würthinger가 박사과정 연구 주제로 구현한 기능으로, JVM을 수정하는 패치 형태이다. DCEVM의 장점은 JRebel 에 비해 실행 속도가 빠르다는 것, 그리고 개발자가 구현한 코드의 바이트코드를 수정하지 않기 때문에, IDE에서 별다른 기능을 지원하지 않아도 되고, IDE 의존성이 없다는 것이다. 단지 애플리케이션을 실행하기 위한 JVM을 DCEVM 패치 적용된 것으로 선택하면 된다.
- https://github.com/HotswapProjects/HotswapAgent 에서 배포하는 DCEVM installer는 Java 7과 Java 8 버전을 지원한다.
- https://github.com/dcevm/dcevm 에서 최신 버전의 소스코드를 관리한다. Java 7, Java 8 업데이트에 따라 패치를 계속 수정하는 것으로 보인다. DCEVM 이 light 버전과 full 버전으로 분리되었는데, full 버전은 현재 Java 7 버전만을 지원한다. light 버전은 Java 7 과 Java 8 을 모두 지원하는데, class hierarchy 수정에 대한 기능이 제한적이다. 기능 제한을 간단히 설명하면, class hierarchy 에 추가되는 것은 가능한데, 삭제되는 것은 지원하지 않는다고 한다. – 2014년 11월 현재
- DCEVM 기반의 Hotswap Agent 가 공개되어 있다. jar 로 배포하는 이 agent 를 적용하게 되면, 추가적인 유용한 기능을 사용할 수 있게 된다.
- Hotswap Agent Homepage
- DCEVM 기반의 Hotswap Agent 가 제공하는 기능
- DCEVM light 버전을 인스톨러로 배포하고 있다. full 버전이 아니기 때문에, class hierarchy 변경을 hot swap 하는데 제약이 있다.
- IDE 개발 환경에서는 debug mode 로 실행하는 것만으로 변경된 class 를 reload 하는 hot swap 기능을 이용할 수 있다.
- autoHotswap 프로퍼티를 설정하면, 프로덕션 시스템에서도 JVM 재시작 없이 클래스를 reload 할 수 있게 된다.
- JAR 에 들어있지 않은 모든 로컬 파일시스템의 파일에 대해 변경을 모니터링하며 reload 하는 기능을 자동적으로 수행한다. 어느 경로의 어떤 파일들의 변경을 지켜봐야 하는지 따로 설정하지 않아도, 기본 설정으로 작동하게 된다.
- 추가 classpath 를 지정할 수 있다. extraClasspath 프로퍼티를 이용해, 변경을 모니터링할 클래스 파일들의 디렉토리를 추가할 수 있다.
- resource 파일이 변경된 경우에도 reload 하도록 설정할 수 있다. webapp 디렉토리 내의 resources 는 애플리케이션 서버가 reload 하는 것이 일반적인데, src/main/resources 는 그렇지 않다. watchResources 프로퍼티를 이용해 resource 파일 변경을 모니터링할 수 있다.
- 프레임워크를 지원한다. 상세한 기능은 https://github.com/HotswapProjects/HotswapAgent#hotswap-agent-1 를 참고하면 된다. 이 가운데, 스프링 프레임워크 지원 기능은 아래와 같다.
Modify root Spring classes to get Spring contexts and registered scan path
- Watch for any resource change on a scan path
- Watch for a hotswap of a class file within a scan path package
- Reload bean definition after a change
- ... and many other
- IntelliJ 에서는 DCEVM 을 위한 플러그인을 제공한다. 이 플러그인은 본질적으로 특별한 기능을 제공하는 것은 아니고, 프로젝트 설정에서 VM을 선택할 수 있게 목록을 제공하는 등 설정을 도와주는 것이다.
- DCEVM light 버전을 인스톨러로 배포하고 있다. full 버전이 아니기 때문에, class hierarchy 변경을 hot swap 하는데 제약이 있다.
- 이 문서는 픽 개발시 Java Class 변경이 있을 경우, 매번 톰캣을 재시작하지 않고 동적으로 Hotswap 하는 방법을 설명하는 문서이다.
- 기존에 IntelliJ에 Hotswap 기능이 있지만, Method Body영역만 Howswap이 가능하고, 새로운 메소드의 add / remove, class 생성자 등의 기능들은 제공되지 않아, 일명 Full featured hotswap (true hotswap)을 적용하는 방법을 소개한다.
- 준비물
- JDK 1.8.0 Update 5 build 13
- DCEVM Installer
- IntellIJ DCEVM Integration Plugin
- 설치방법
- JDK 1.8.0 Update 5 build 13을 설치한다. DCEVM Install가 모든 버전의 jdk8을 지원하지 않아서 jdk8 update 5를 설치한다 - 2014.10.29 기준
- 설치가되면 /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk에 설치된다.
- DCEVM Install를 실행시킨다. root권한이 필요하다. sudo java -jar installer-light-jdk8u5.52.jar
- Add installation directory를 눌러서 .../jdk1.8.0_05.jdk/Contents/Home 폴더를 지정한다.
- Replaced by DCEVM / Install DCEVM as altjvm 차례로 누른다.
- 완료후에 java -version 을 했을경우 다음과 같이 나와야 함. $ java -version java version "1.8.0_05" Java(TM) SE Runtime Environment (build 1.8.0_05-b13) Dynamic Code Evolution 64-Bit Server VM (build 25.5-b02-dcevmlight-58, mixed mode) $
- IntelliJ에서 DECVM을 검색해서 DCEVM Integeration 플러그인 설치 후 IntellIJ 재시작.
- 사용방법
- Java 파일을 하나 바꾼다음에 Compile 한후, Tomcat restart 없이 반영되는지 확인
- tip : Ctrl + S나 Cmd+S 등을 Save And Compile Macro로 걸어두면 Save & Compile이되서 저장과 동시에 핫스왑이 된다.