2016-10-18 3 views
1

전체 응용 프로그램을 중단하지 않고 이전 기능의 jar를 새로운 기능으로 대체하는 방법을 찾고 있습니다. 나는 이것에 대한 약간 (Unloading classes in java?, Dynamically loadable and unloadable application modules in Java - how?를) 검색 좀, 3 가능한 해결책을 발견 : 내 목적을 위해 너무 복잡 보인다Tomcat : Tomcat이 클래스를 내부적으로 언로드하는 방법은 무엇입니까?

  1. OSGI : 클래스 하역 내가이 강력한 사양에서 필요로하는 유일한 것입니다.
  2. 고유의 Classloader를 만들고, jars를 도움으로로드하며, jar - expose Classloader 인스턴스를 GC로 닫고 GC가로드 된 모든 jar와 함께이를 제거하므로 즉시 실행되지 않을 수도 있음을 의미합니다. .
  3. 물건 응용 프로그램 서버를 복사 :) 그게 내 질문의 목적입니다.

톰캣이 클래스 (전쟁)를 언로드하는 방법에 대한 설명이 있습니까? 신청서에 이것을 재사용 할 수 있습니까?

PS 나는이 이상한 생각이 내 머리에 와서이 게시물 작성했다 그냥 동안 :

  1. 우리가 항아리의 새로운 세트와 응용 프로그램의 다른 인스턴스를 시작하고 흐름 입력 및 출력 데이터를 전환 할 수있을 수를 새 것에서 오래된 것. 상태를 유지할 수있는 장소가 있으면 완전히 다시 시작하는 것보다 빠를 수 있습니다.
  2. 봄이 도움이 될 수 있습니까? 콩을 동적으로 등록 할 수는 있지만 다소 엉망인 해결책처럼 보이며 어쨌든 언로드 할 수 없습니다. 아마도 스프링 부트가 도움이 될까요?
+1

OSGi는 많은 코너 케이스를 처리해야하므로 복잡해 보일 수 있습니다. 2 번이나 3 번 경로로 간다면 OSGi의 상당 부분을 다시 구현하게 될 것입니다 :-) –

답변

1

나는 부분적으로 만 질문에 답할 수 있지만, 아무 것도없는 것보다 ... 당신이 맞습니다. 모듈성은 상당히 지루한 주제입니다 (최소한 Java 9가있을 때까지).

광고 아이디어 2 (봄) : 이미 스프링 부트 over here에 대해 생각해 보았습니다. OSGI (그만한 가치가 있습니다) 또는 순수한 마이크로 서비스 아키텍처에 중점을 둡니다. 당신이 그것을

  • 을 개발하는 동안 변경하지 않고 방법의 기능을 변경하려면

  • +1

    모듈화는 자바 9에서도 지루한 토픽이 될 것입니다. Java 9에는 마법의 요정 먼지가 없습니다. :-) –

    1
    • 난 당신이 응용 프로그램의 전체 재배치를 수행하지 않는 것으로 생각하지만, 전체 응용 프로그램마다 다시 시작하고 싶지 않아 경로 \ springloa : 클래스 나 메소드 서명 당신은 Spring 프로젝트 https://mvnrepository.com/artifact/org.springframework/springloaded/1.2.6.RELEASE

    • 설정 JVM 옵션 -javaagent에 종속성을 추가

    • 부하 사용할 수 있습니다 ded-version.항아리 -noverify

      • 이 옵션은 당신이 나는 잎이 넓은 담배 eccomerce 웹 사이트를하고 난 바람둥이를 내장하거나 실행됩니다 배치 스크립트에서 MAVEN_OPTS에이 옵션을 추가 바람둥이

      • 실행 방법에 따라 여러 가지 방법으로 설정할 수 있습니다 당신은 톰캣 VM 옵션에 대한 실행 구성에서 그 구성 할 수 있습니다

    • http://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html

    읽기
    +0

    고마워, Zildyan! 내가 아는 바로는 이것은 핫 스왑 기술과 관련이있다. 그러나 로딩/언 로딩 기술에 더 많은 관심이 있습니다. 차이점은 메모리의 일부 클래스 인스턴스를 핫 스와핑으로 대체하는 반면 추가하고 완전히 제거하려는 것입니다. – MiamiBeach

    2

    클래스는 클래스 로더에 도달 할 수 없어 가비지 수집 대상이 될 때만 언로드 할 수 있습니다. 클래스 로더가로드 한 모든 클래스에 도달 할 수 있고 클래스 로더에 의해로드 된 모든 클래스가 클래스 로더에 도달 할 수 있고 클래스의 인스턴스 인 모든 객체가 해당 클래스에 도달 할 수 있기 때문에 클래스 로더,로드 된 모든 클래스 해당 클래스의 인스턴스 인 모든 객체는 모두에 도달 할 수 없으며 가비지 수집 대상이되어야합니다. 그런 다음에 만 전체 개체 그래프가 가비지 수집 될 때 클래스를 "언로드"할 수 있습니다.

    관련 문제