• Ubuntu16.04 编译 OpenJDK7


    《深入理解Java虚拟机》第二版第一章实践

    准备

    • Mercurial sudo apt-get install mercurial
    • OpenJDK7
    hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
    cd jdk7u-dev
    chmod 755 get_source.sh
    ./get_source.sh
    

    当前的jdk7u-dev 大小为756MB
    要是对自己的网速没有信心,也可以选择在云服务器上先下载好,然后进行压缩,再传输至本地,实测压缩后仅有250MB左右

    编译过程

    依赖

    • sudo apt-get install build-essential gawk m4 openjdk-6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev ant


      其中,openjdk-6-jdk 是不能直接apt-get 的,google以后Github-bmaupin给出了一个解决方案,我们可以直接去到http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html,选择合适的包下载。下载前还需要注册一个Oracle帐号。下载好jdk-6u45-linux-x64.bin后复制到想要的目录并运行,相同目录下就会创建一个包含有jdk的文件夹。


      libmotif3也不能直接安装,需要从https://launchpad.net/ubuntu/xenial/amd64/libmotif3/2.3.4-8ubuntu1下载
    • 环境变量设置 environment.sh见最后,输入source environment.sh,然后make sanity检查


      如果输出是Sanity check passed,则证明检查通过,可以进行make了

    编译

    • 输入make 2>&1 | tee $ALT_OUTPUTDIR/build.log进行编译
    • 若出现以下信息,则证明编译成功
    #-- Build times ----------
    Target all_product_build
    Start 2017-10-19 23:38:57
    End   2017-10-19 23:53:03
    00:00:11 corba
    00:01:06 hotspot
    00:00:02 jaxp
    00:00:04 jaxws
    00:12:41 jdk
    00:00:02 langtools
    00:14:06 TOTAL
    -------------------------
    

    Hotspot

    • 进入OpenJDK目录/hotspot/make,复制environment.sh,依次运行source environment.shmake
    • Hotspot的编译与JDK的编译大体相似,但还是有所不同,主要修改的还是environment.sh
    • 如果是64位系统,在最后加上export ARCH_DATA_MODEL=64,否则会在编译过程中提示部分头文件找不到
    • 编译的输出路径建议进行修改,不然jdk与hotspot的编译输出都会放在build下面,比较难分辨
    • 编译完成后可以去linux_amd64_compiler2/fastdebuf下修改env.sh,添加
    LD_LIBRART_PATH=.:{JAVA_HOME}/jre/lib/amd64/native_threads:%{JAVA_HOME}/jre/lib/amd64:
    export LD_LIBRARY_PATH
    

    然后依次运行source env.sh./gamma -version,如果编译成功,就能看到结果。

    Netbeans

    • 去到Netbeans官网下载最新版本并安装
    • Netbeans 源码调试教程
    • 该教程中有些地方与本文的介绍不太合适,这里是更正:
    1. Pre-Build Action: 此处输入的命令应为./environment.sh
    2. Build-Action: 此处Build Command应该是${MAKE} -f Makefile clean jvmg ALT_BOOTDIR=environment.sh中的ALT_BOOTDIR ARCH_DATA_MODEL=64 LANG=C
    • Netbeans下编译好的文件将会存放在OpenJDK目录/hotspot/build/linux/linux_amd64_compiler2/jvmg下。

    错误

    进入hotspot/src/share/vm/gc_implementation/g1
    修改g1SATBCardTableModRefBS.cpp 修改内容如下(67行开始):

    template <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 = oopDesc::load_heap_oop(elem_ptr);
        if (!oopDesc::is_null(heap_oop)) {
          enqueue(oopDesc::decode_heap_oop_not_null(heap_oop));
        }
      }
    }
    
    //2017-10-19 Vicent_Chen added
    void G1SATBCardTableModRefBS::write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) {
      if (!dest_uninitialized) {
        write_ref_array_pre_work(dst, count);
      }
    }
    void G1SATBCardTableModRefBS::write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) {
      if (!dest_uninitialized) {
        write_ref_array_pre_work(dst, count);
      }
    }
    //2017-10-19 Vicent_Chen added
    

    修改g1SATBCardTableModRefBS.hpp 修改内容如下:(87行开始)

      template <class T> void write_ref_array_pre_work(T* dst, int count);
      // 2017-10-19 Vicent_Chen modified
      /*
      virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) {
        if (!dest_uninitialized) {
          write_ref_array_pre_work(dst, count);
        }
      }
      virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) {
        if (!dest_uninitialized) {
          write_ref_array_pre_work(dst, count);
        }
      }
      */
      virtual 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);
      // 2017-10-19 Vicent_Chen modified
    
    

    编译后

    编译完成后Ubuntu的图形界面会有点卡,怀疑是内存泄漏,建议重启

    #!/bin/sh
    # environment.sh
    
    # 语言选项,若不设置则会在编译好后出现一个HashTable的NPE错
    export LANG=C
    # Bootstrap JDK的安装路径
    export ALT_BOOTDIR=#JDK安装路径(上文提到的Oracel JDK安装路径)
    # 允许自动下载依赖
    export ALLOW_DOWNLOADS=true
    # 并行编译线程数,设置为和CPU内核数一样即可
    export HOTSPOT_BUILD_JOBS=4
    export ALT_PARALLEL_COMPILE_JOBS=4
    
    # 比较本次build出来的映像与先前版本的差异。这对我们来说没有意义
    # 必须设置为false,否则sanity检查会报缺少先前版本JDK的映像的错误提示
    # 如果已经设置 dev 或者 DEV_ONLY = true,这个不显式设置也行
    export SKIP_COMPARE_IMAGES=true
    
    # 使用预编译头文件,不加这个编译会慢些
    export USE_PRECOMPILED_HEADER=true
    
    # 要编译的内容
    export BUILD_LANGTOOLS=true
    #export BUILD_JAXP=false
    #export BUILD_JAXWS=false
    #export BUILD_CORBA=false
    export BUILD_HOTSPORT=true
    export BUILD_JDK=true
    
    # 要编译的版本
    # export SKIP_DEBUG_BUILD=false
    # export SKIP_FASTDEBUG_BUILD=true
    # export DEBUG_NAME=debug
    
    # 把它设置为false可以避开javaws和浏览器Java插件之类的部分的build
    BUILD_DEPLOY=false
    
    # 把它设置为false就不会build出安装包,因为安装包里有奇怪的依赖项
    # 但即便不build出它也已经能得到完整的JDK映像,所以还是不build
    BUILD_INSTALL=false
    
    # 编译结果存放路径
    export ALT_OUTPUTDIR= #openjdk7 路径/build
    
    # 这两个环境变量必须去掉,否则会有奇怪的事情发生
    unset JAVA_HOME
    unset CLASSPATH
    
    # 这个环境变量是make sanity建议消除的
    unset LD_LIBRARY_PATH 
    
  • 相关阅读:
    我与计算机简述
    第十五周计应151班第四组排球计分程序
    第十五周排球积分查询程序
    本周总结
    计应1班第4小组第一次产品计划会议
    本周总结
    计应1班第4小组“排球比赛计分程序”的典型用户、创立场景、用户故事
    排球计分规则功能说明书
    我与计算机
    5th 各组作品alpha发布体会
  • 原文地址:https://www.cnblogs.com/Vicent-Chen/p/7708932.html
Copyright © 2020-2023  润新知