Java가 홍보하는 이유는 실제로 교차 플랫폼이기 때문에 큰 이유이며, 큰 역할은 가상 기계 관계 때문입니다.
일반적으로 개발자는 매일 개발하기 위해 가상 머신의 내부 구현에주의를 기울일 필요가 없지만 때로는 성능과 관련하여 가상 머신의 구현 메커니즘을 이해해야합니다.
그래서 제가 오늘 쓴 것은 미래에 가상 머신의 기본 원리를 이해하는 길을 열어주기 위해 자신의 가상 머신 세트를 컴파일하는 것입니다.
가상 머신을 컴파일하면 많은 함정이 발생할 수 있으며 시간이 걸릴 수 있습니다. 환경의 차이로 인해 발생할 수있는 문제는 일관성이 없습니다.
나는 내가 직면 한 모든 문제를 나열했다고 말할 수 있습니다.
1 우선, OpenJDK의 소스 코드를 다운로드해야합니다. 이 OpenJDK에는 실제로 버전 기록이 있습니다. 당신은 그것에 대해 배울 수 있습니다.
그런 다음 대부분의 소스 코드 컨텐츠는 Oracle JDK 컨텐츠와 동일하며 몇 가지 내용이 다릅니다.
여기에 다운로드 한 OpenJDK의 소스 코드는 OpenJDK-7U75-SRC-B13-18_DEC_2014.ZIP입니다. 모든 사람의 버전은 다를 수 있지만 OpenJDK의 소스 코드입니다.
2 위의 것들을 준비하는 것 외에도 Oracle JDK를 준비해야합니다. 이 JDK에 JDK-6U32-LINUX-X64.BIN을 사용합니다.
3 Linux에 대한 다양한 종속성을 먼저 준비하십시오. 이러한 종속성은 나중에 얻을 것입니다. 또한 Linux 시스템에 대해 이야기하고 싶습니다.
우분투의 16.04lts 64 비트이므로 이전 사항에 대해 64 비트를 준비하는 것이 가장 좋습니다.
모든 것이 준비되었습니다. 이제 우리는 일을 시작할 것입니다! ! ! !
1 이전에 Java_Home 또는 ClassPath 환경 변수를 설정하면 먼저 주석을주십시오.
2 UNZIP OPENJDK-7U7U75-SRC-B13-18_DEC_2014.ZIP 및 OPENJDK 폴더를 가져옵니다. 우리는 그것을 /usr 아래에 넣었습니다.
3execute JDK-6U32-LINUX-X64.BIN JDK1.6.0_32 폴더를 얻으십시오. 이 폴더를 /usr /java에 넣는 것에 대해 이야기합시다.
4 Vim /etc /프로파일을 입력하고 마지막에 다음 내용을 추가하십시오.
내보내기 lang = c#bootstrap-jdk 설치 경로, bootstrap-jdk export alt_bootdir =/usr/java/jdk1.6.0_32#위와 동일하게 OpenJDK를 사용하여 핫스팟으로 교체했을 때 oraclejdk로 교체했습니다. 독자는 OracleJDKEXPORT ALT_JDK_IMPORT_PATH =/USR/JAVA/JDK1.6.0_32#이 스크립트 내보내기 HOTSPOT_BUILD_JOBS = 4 EXPORT ATT_PARALLEL_COMPILE_JOBS = 4 엘리 포트를 선택할 수 있도록 컨텐츠를 선택할 수 있습니다. build_jaxws = false#export build_jaxp = false#내보내기 build_corba = falsexport build_hotspot = trueexport build_jdk = trueexport skip_compare_images = truebuild_deploy = false#compiled#compiled#compiled 폴더에 저장되도록 권장됩니다. 내보내기 alt_outputdir =/usr/openjdk/buildexport allow_downloads = true#두 환경 변수를 제거해야합니다. 그렇지 않으면 문제가 없습니다. 티 $ alt_outputdir/build.log
구성을 업데이트하려면 소스 /etc /프로파일이 필요합니다. 그러나 입력 후에는 즉시 실행되지만 아직 수행되지 않은 것들에 의존하기 때문에 지금은 성공하지 못할 것입니다. Ctrl+C를 즉시 눌러 일시 중지하십시오.
5 터미널에서 일부 명령을 실행하여 필요한 종속성을 설치하려면 명령은 다음과 같습니다.
sudo apt-get 설치 빌드 필수 Gawk M4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-common ant
일부 장소에는 OpenJDK-6-JDK가 설치되어 있습니다. 사실, 이것을 여기에 설치하지 않는 것이 좋습니다. Oracle JDK를 사용하여 OpenJDK 소스 코드를 컴파일합니다. OpenJDK-6-JDK를 사용하여 OpenJDK 소스 코드를 컴파일하는 것이 좋습니다. 그렇기 때문에 JDK 주소가 내 build.sh 스크립트가 내보내기 alt_bootdir =/usr/java/jdk1.6.0_32입니다.
6 이제 우리는 /usr /openjdk 디렉토리로 이동하여 Make Sanity 명령을 실행하고 구성이 정상인지 확인합니다. 문제가 없으면 표시됩니다
70,000 개의 물건을 사용할 수 있으며 동쪽 바람 만 필요하며, 제작을 입력하고 컴파일을 시작하십시오. 컴파일 된 물건은/usr/openjdk/빌드 디렉토리에서 생성됩니다.
이것은 프로세스이지만이 기간 동안 일부 문제가 발생합니다. 그에 의해보고 된 오류에 따르면, 우리는 몇 가지 오류를 수정해야합니다. 수정 후 계속 명령을 내린 다음 컴파일합니다.
다음은 몇 가지 오류와 솔루션이 있습니다.
1>
echo "***이 OS는 지원되지 않습니다."`uname -a`; 출구 1;
OpenJDK/HotSpot/make/linux/makefile : 240 : 대상 'check_os_version'을위한 레시피에 실패했습니다
해결하다:
/OpenJDK/HotSpot/Make/Linux/Makefile에서 다음 세 줄의 check_os_version을 주석
check_os_version :
#ifeq ($ (disable_hotspot_os_version_check) $ (empty_if_not_supported),)
# $ (조용히)> & 2 echo "***이 OS는 지원되지 않습니다 :"`uname -a`; 출구 1;
#endif
2>
`void g1satbcardtablemodrefbs :: write_ref_array_pre_work <Oopdesc*> (oopdesc **, int)에 대한 정의되지 않은 참조
솔루션 : 핫스팟/src/share/vm/gc_implementation/g1에서 g1satbcardtablemodrefbs.cpp를 설정하십시오
템플릿 <class t> void g1satbcardtablemodrefbs :: write_ref_array_pre_work (t* dst, int count) {if (! javathread :: satb_mark_queue_set (). is_active ()) return; t* elem_ptr = dst; for (int i = 0; i <count; i ++, elem_ptr ++) {t heap_oop = ooopdesc :: load_heap_oop (elem_ptr); if (! ooopdesc :: is_null (heap_oop)) {enqueue (oopdesc :: decode_heap_oop_nult_null (heap_oop)); }}} 컨텐츠에 다음 내용 추가
// 2017-10-19 VICENT_CHEN 추가 void void void void g1satbcardtableModrefbs :: write_ref_array_pre (oop* dst, int count, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }} void void void void g1satbcardtablemodrefbs :: write_ref_array_pre (marrowoop* dst, int count, bool dest_uninitialized) {if (! dest_uninItialized) {write_ref_array_pre_work (dst, count); }} // 2017-10-19 VICENT_CHEN이 추가되었습니다
hotspot/src/share/vm/gc_implementation/g1에 g1satbcardtablemodrefbs.hpp를 다음과 같이 배치하십시오
virtual void void write_ref_array_pre (oop* dst, int count, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }} virtual void void write_ref_array_pre (narrowoop* dst, int count, bool dest_uninitialized) {if (! dest_uninitialized) {write_ref_array_pre_work (dst, count); }}
댓글을 달고 가상 void write_ref_array_pre (oop* dst, int count, bool dest_uninitialized)를 추가하십시오. virtual void write_ref_array_pre (narrowoop* dst, int count, bool dest_unintialized);
3>
오류 : 시간은 현재부터 10 년 이상입니다 : 1136059200000
해결하다:
OpenJDK/JDK/SRC/Share/Classs/Java/Util/CurrencyData.Properties 파일에서 다음 시간은 10 년 이내에 변경됩니다.
AZ = AZM; 2005-12-31-20-00-00; AZN
MZ = MZM; 2006-06-30-22-00-00; MZN
ro = rol; 2005-06-30-21-00-00; Ron
tr = trl; 2004-12-31-22-00-00; 시도해보십시오
VE = VEB; 2008-01-01-04-00-00; VEF
4> 앞으로 rmiserverimpl_stub.class를 컴파일 할 때 시스템 모니터를 통해이 기간 동안 메모리가 급격히 증가했음을 관찰했기 때문에 메모리가 충분하지 않을 수 있습니다. 구체적인 이유는 모르겠지만 마지막으로 Make Command를 여러 번 연속으로 다시 들어 왔습니다.
다시 성공. 따라서이 상황에 직면하면 다시 여러 번 수행 할 수 있습니다. 마지막으로 메모리가 급등하지 않았습니다.
편집은 다음과 같이 성공적입니다.
그런 다음 빌드 폴더에서 컴파일 된 JDK를 찾을 수 있습니다.
모두 감사합니다. 궁금한 점이 있으시면 저에게 물어보십시오.
컴파일 가상 머신 JVM-Openjdk를 기반으로 한 컴파일에 대한 위의 자세한 설명은 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.