class file has wrong version 49.0, should be 48.0

원인 : JDK 1.5 로 컴파일 되고, 실행 환경은 그 이하일 경우

해결 : 이클립스의 프로젝트 Properties에서 Java Compiler 메뉴에서
         Enable Project specific settings 체크 -> Compiler compliance level 을 실행환경의 JDK 버젼으로 변경. 49.0 - 48.0 일 경우 대부분 1.4로 체크하면 해결
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 가이던스




클래스 로드

2007/12/12 01:09

클래스 로딩

클래스 로딩 과정은 두단계로 나뉜다.

1. 로딩 : 바이트 덩어리의 클래스를 클래스의 이름을 이용하여 찾고, JVM에 이 바이트 덩어리가 클래스의 implementation이라고 알린다. ClassLoader는 해당 클래스를 로딩할때 슈퍼클래스를 로딩하게 된다. 여기서 느껴지는것이 있을것이다. 맞다. 슈퍼클래스를 로딩할 때 슈퍼클래스의 이름을 이용해서 바이트 덩어리를 찾고 JVM에 해당 바이트 덩어리가 클래스의 implementation이라고 알린 후, 슈퍼클래스를 로딩한다. 여기서 느껴지는건??? 맞다... 슈퍼클래스의 슈퍼클래스, 슈퍼클래스의 슈퍼클래스의 슈퍼클래스........... 를 로딩한다.
이런 로딩 과정을 통해 JVM은 클래스의 이름과 클래스 구조에서의 위치, 필드, 메소드 들에 대해 알게 된다.

2. 링킹 : 링킹 단계에서 클래스를 검증한다. 검증을 통과하게 되면 정적 초기화를 수행하는 clinit 이 호출된다. 검증의 사이드 이펙트로 관련 클래스들이 함께 로딩된다.

흠.... 어디까지나 관련 클래스들은 로딩된다. 로딩된다. 그저 로딩 될 뿐이다. 로딩 다음 단계인 링킹단계로 넘어가지 않는다는 뜻이다. 실제 해당 클래스가 필요해질 때 ( 아마 사용될 때? ) 링킹 단계를 거치게 된다.

이런 구조를 가지게 된 이유야 많고 많을것이고, 속 사정까지 알기에는 자바에 대해 아는것이 워낙에 없기 때문에... 간단하게 장점 정도만 생각해보자. 어떤 장점이 있을까?

- 퍼포먼스 향상 : 어찌됬든 링킹도 시간이 걸리는 일일것이다. 우선 클래스를 검증해야 한다. 검증도 꽤나 복잡한 과정이다. 더더군다나 검증 도중 관련 클래스들을 로등한다. 얼핏 생각해도 나노월드에서는 꽤나 긴 시간일 것이다. 실제 클래스가 필요할 때 링킹을 함으로써, 불필요하게 링킹되는것도 막으면서, 실제 사용 되는 클래스만 링킹 하면 되기 때문에 많은 시간을 절약 할 수 있다.
만약, 모든 클래스를 로딩과 동시에 링킹을 하게 되면... WAS를 띄우고 첫 request를 보낼 때 모든 클래스를 링킹하려고 할거다. 사이즈가 작은 WA면 모르겠지만, 사이즈가 크고 수많은 클래스를 사용하게 되면... 우후~ JSP 컴파일 하는 시간에 ( 사실 JSP 컴파일 하면 이놈도 class인데... 이놈도 로딩과 링킹을 할거다. ) 사용되는 클래스와 관련된 모든 클래스의 링킹 ( JDK에서 제공하는 클래스도 포함하면 어마어마 해지지 않을까? - 사용되는 클래스 뿐 아니라 슈퍼클래스도 로딩하고 링킹해야 될테니까 ) 하는 시간이 더해지게 될거다. 윽... 테스트 한번 하려면 그 수많은 시간을 버텨내야.... ( 뭐... 생각보다 얼마 안될지도 모른다. 그래봐야 몇천개의 클래스 일테고, 한개 로딩하고 링킹하는데 그리 오래 걸리지도 않을테니... )

- 상호 참조 : 어찌되었든 클래스가 사용되기 전에는 링킹하지 않는다. 즉, 서로 상호 참조하는 클래스가 있다고 해도, 먼저 참조되는 클래스가 링킹되고( 물론 이때 다른 클래스도 로딩 될테지만... ) 다른 클래스는 쓰이게 될 때 링킹된다. 만약, 동시에 링킹 되어야 한다면... 뭐부터 링킹을 해야할까? 닭이 먼저? 알이 먼저?



* 클래스 로더를 사용하지 않는 클래스 로딩
- 클래스 로더를 사용하지 않는 클래스 로딩이 존재한다. 흠... 얼핏 말이 안된다고 생각을 할 수 있겠지만...

1. 클래스 로더
클래스 로더도 클래스다. 클래스 로더도 클래스라면 클래스 로더를 통해 로딩되고 링킹 되어야 한다. 헉~ 이게 말이 되는가? 클래스 로더가 로딩되고 링킹이 되지 않았는데, 클래스 로더를 사용하여 클래스 로더를 로딩하고 링킹을 하겠다니.... 어렵다.. 머리 복잡해진다...ㅡ,.ㅡ
클래스 로더와 같은 클래스들을 System class 라고 부른다. JVM에서는 이런 클래스들을 로딩하기 위한 내부적인 방법을 가지고 있다. 일반적으로 CLASSPATH 환경 변수가 이런 역할을 한다. JVM은 CLASSPATH에서 클래스들을 발견하게 되면 클래스 로더가 하는 것과 마찬가지로 로딩과 링킹을 한다.

2. 배열
잘 따져보면 배열도 객체다. 객체면 클래스를 가져야 한다. 하지만, 배열은 배열이라는 것 만으로 ( 이미 선언할 때 배열이라는것을 알려주니까 ) 정의를 알 수 있다. 즉, 클래스가 따로 필요 없다는것이다.


다음번에는 로딩에 대해서 알아볼까나~

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 가이던스





BLOG main image
Direction
내 삶의 목표, 방향 by 가이던스

공지사항

카테고리

분류 전체보기 (8)
android (0)
Java (8)
기타 (0)

글 보관함

달력

«   2007/12   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
Total : 15,655
Today : 1 Yesterday : 10