URLClassLoader 닫기

Java SE 2009/04/06 19:40 Posted by Sun

애플리케이션 서버와 같은 복합적인 자바 프로그램에서는 URLClassLoader 유형을 사용하여 자체 클래스 로더를 만들 때도 있습니다. URLClassLoader를 사용하면 애플리케이션에서 URL 검색 경로로부터 클래스와 리소스를 로드할 수 있습니다. 다음 URL 유형이 지원됩니다.

  • file: (파일 시스템 디렉토리에서 로드)
  • jar: (JAR 파일에서 로드)
  • http: (http 서버에서 로드)

지금까지 자주 문제되었던 것 중 하나가 특정 코드베이스로부터, 특히 JAR 파일로부터 로드한 클래스 및 리소스의 업데이트된 구현을 어떻게 지원하느냐였습니다. 원칙적으로, 애플리케이션에서 어떤 로더 개체에 대한 모든 참조를 지우면 가비지 콜렉터 및 완료 메커니즘에 의해 결국 모든 리소스(예: JarFile 개체)가 릴리스되고 닫혀집니다.

그런 다음 애플리케이션은 JAR 파일을 대체하고 동일한 위치로부터 로드할 새 URLClassLoader 인스턴스를 만들 수 있는데, 이번에는 클래스/리소스의 새로운 구현을 사용합니다.

그러나 완료 및 가비지 콜렉션이 언제 수행되는지 정확하게 예측할 수 없으므로, 예측 가능하고 시기적절하게 이 작업을 수행해야 하는 애플리케이션에서는 문제가 생깁니다. 특히 열려 있는 파일을 삭제하거나 대체할 수 없는 Windows에서는 문제가 됩니다.

이 문제를 해결하기 위해 URLClassLoader에 close()라는 새 메소드가 추가되었습니다. 이 메소드는 JDK 7 빌드 48부터 구현되었습니다.

close() 메소드는 사실상 로더를 무효화하여 더 이상 그로부터 새 클래스를 로드할 수 없게 합니다. 또한 로더에 의해 열린 모든 JAR 파일을 닫습니다. 그 덕분에 애플리케이션에서는 이 파일을 삭제하거나 대체하고 필요하다면 새 구현을 사용하여 새 로더를 만들 수 있습니다.

이 새로운 메소드는 친숙한 "Closeable" 패턴을 따르며, 이제 URLClassLoader는 URLClassLoader.close()를 정의하는 Closeable interface를 구현합니다. 다음 샘플 코드는 이 메서드 사용 방법을 보여 줍니다.

     


//
// create a class loader loading from "foo.jar"
//
URL url = new URL("file:foo.jar");
URLClassLoader loader = new URLClassLoader (new URL[] {url});
Class cl = Class.forName ("Foo", true, loader);
Runnable foo = (Runnable) cl.newInstance();
foo.run();
loader.close ();

// foo.jar gets updated somehow

loader = new URLClassLoader (new URL[] {url});
cl = Class.forName ("Foo", true, loader);
foo = (Runnable) cl.newInstance();
// run the new implementation of Foo
foo.run();


Michael McMahon은 썬마이크로시스템즈 소속 엔지니어로서 자바 보안, 네트워킹 및 라이브러리 그룹에서 일하고 있습니다.

이 글의 영문 원본은
Closing a URLClassLoader
에서 보실 수 있습니다.

"Java SE" 카테고리의 다른 글

2009/04/06 19:40 2009/04/06 19:40

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/770

  1. eoh의 생각

    Tracked from endofhope's me2DAY  삭제

    URLClassLoader 닫기 windows 에서 Web Context reloading 할때 생기던 고질적인 문제가 드디어 해결되는가. 더 이상의 삽질 코드는 빼도 될까? 하지만 jdk version 7 이란게 에러 ^^

    2009/04/30 14:10

댓글을 달아 주세요

[로그인][오픈아이디란?]

◀ Prev 1  ... 102 103 104 105 106 107 108 109 110  ... 806  Next ▶