当前位置: 首页 > news >正文

织梦可以做视频网站么知名餐饮设计公司

织梦可以做视频网站么,知名餐饮设计公司,外贸网站建设要注意什么,上海建设安检站网站1.6实战:自己编译JDK 想要一探JDK内部的实现机制#xff0c;最便捷的路径之一就是自己编译- -套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理#xff0c;虽然门槛会高一点#xff0c;但肯定会比阅读各种书籍、文章更加贴近本质。另外#xff0c;JDK中的很多底层…1.6实战:自己编译JDK 想要一探JDK内部的实现机制最便捷的路径之一就是自己编译- -套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理虽然门槛会高一点但肯定会比阅读各种书籍、文章更加贴近本质。另外JDK中的很多底层方法都是本地化(Native) 的需要跟踪这些方法的运作或对JDK进行Hack的时候都需要自己编译套JDK。现在网络上有不少开源的JDK实现可以供我们选择如Apache Harmony. OpenJDK等。考虑到Sun系列的JDK是现在使用得最广^泛的JDK版本笔者选择了OpenJDK进行这次编 译实战。 1.6.1 获取JDK源码 首先要先明确OpenJDK和Sun/OracleJDK之间以及OpenJDK 6、OpenJDK 7、OpenJDK 7u和OpenJDK 8等项目之间是什么关系这有助于确定接下来编译要使用的JDK版本和源码分支。从前面介绍的Java发展史中我们了解到OpenJDK是Sun在2006年末把Java开源而形成的项目这里的“开源”是通常意义上的源码开放形式即源码是可被复用的例如IcedTea 9、UltraViolet9都 是从OpenJDK源码衍生出的发行版。但如果仅从“开源”字面意义(开放可阅读的源码)上看其实Sun自JDK 1.5之后就开始以Java Research License(JRL)的形式公布过Java源码主要用于研究人员阅读(JRL许可证的开放源码至JDK1.6 Update 23为止)。把这些JRL许可证形式的Sun/OracleJDK源码和对应版本的OpenJDK源码进行比较发现除了文件头的版权注释之外其余代码基本上都是相同的只有字体渲染部分存在一点差异OracleJDK采用了商业实现而OpenJDK使用的是开源的FreeType。当然“相同”是建立在两者共有的组件基础上的Oracle JDK中还会存在- - 些Open JDK没有的、商用闭源的功能例如从JRockit移植改造而来的Java Flight Recorder。预计以后JRockit 的MissionControl移植到HotSpot之后也会以Oracle JDK专有、闭源的形式提供。 Oracle的项目发布经理JoeDarcy在OSCON2011.上对两者关系的介绍9也证实了OpenJDK7和OracleJDK7在程序上是非常接近的两者共用了大量相同的代码(如图1-6所示注意图中提示了两者共同代码的占比要远高于图形上看到的比例)所以我们编译的OpenJDK基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是-致的。 是始于JDK 6时期当时JDK 6和JDK 6 Update 1已经发布JDK 7已经开始研发了所以OpenJDK7是直接基于正在研发的JDK7源码建立的。但考虑到OpenJDK7的状况在当时还不适合实际生产部署因此在OpenJDK 7 Build 20的基础上建立了OpenJDK 6分支剥离掉JDK 7新功能的代码形成-一个可以通过TCK 6测试的独立分支。2012年7月JDK 7正式发布在OpenJDK中也同步建立了OpenJDK 7 Update项目对JDK 7进行更新升级以及OpenJDK 8项目开始下一个JDK大版本的研发。按照开发习惯, .新的功能或Bug修复通常是在最新分支上进行的当功能或修复在最新分支上稳定之后会同步到其他老版本的维护分支.上。OpenJDK 6、OpenJDK 7、OpenJDK 7u和OpenJDK 8的源码都可以在它们相应的网页上找到在本次编译实践中笔者选用的项目是OpenJDK 7u,版本为7u6。获取OpenJDK源码有两种方式其中一种是通过Mercurial代码版本管理工具从 Repository中直接取得源码(Repository 地址: htp://hg.openjdk java.net/jdk7u/jdk7u)获取过程如以下代码所示。 这是最直接的方式从版本管理中看变更轨迹比看Release Note效果更好。但不足之处是速度太慢虽然代码总容量只有300 MB左右但是文件数量太多在笔者的网络下全部复制到本地需要数小时。另外考虑到Mercurial不如Git、SVN、ClearCase 或CVS之类的版本控制工具那样普及对于一般读者建议采用第二种方式即直接下载官方打包好的源码包读者可以从Source Bundle Releases页面(地址: htp://jdk7 java.net/source.html)取得打包好的源码到本地直接解压即可。一般来说源码包大概- - 至两个月左右会更新--次虽然不够及时但比起从Mercurial复制代码的确方便和快捷许多。笔者下载的是OpenJDK 7 Update 6 Build b21版源码包2012 年8月28日发布大概99MB解压后约为339MB.  1.6.2系统需求 如果可能笔者建议尽量在Linux、MacOS或Solaris上构建OpenJDK这要比在Windows平台上容易得多本章实战中笔者将以Ubuntu 10.10 和MacOS x 10.8.2 为例进行构建。如果读者- -定要在 Windows平台上完成编译可参考本书附录A该附录是本书第- -版中介绍如何在Windows下编译OpenJDK 6的例子原有的部分内容现在已经过时了(例如安装Plug部分)但还是有一-定参考意义因此笔者没有把它删除掉而是移到附录之中。无论在什么平台下进行编译都建议读者认真阅读- - 遍源码中的README-builds .html文档(无论在OpenJDK网站上还是在下载的源码包中都有这份文档)因为编译过程中需要注意的细节非常多。虽然不至于像文档上所描述的“Building the source code for the JDKrequires a high level of technical expertise. Sun provides the source code primarily for technical experts who want to conduct research. ( 编译JDK需要很高的专业技术Sun 提供JDK源码是为了技术专家进行研究之用)”那么夸张但是如果读者是第一- 次编译那有可能会在一些小问题上耗费许多时间。在本次编译中采用的是64位操作系统编译的也是64位的OpenJDK如果需要编译32位版本那建议在32位操作系统上进行。在官方文档上写到编译OpenJDK至少需要512MB的内存和600MB的磁盘空间。512MB的内存也许能凑合使用不过600MB的磁盘空间估计仅是指存放OpenJDK源码所需的空间要完成编译600MB肯定是无论如何都不够的光输出的编译结果就有近3GB (因为有很多中间文件以及会编译出不同优化级别( Product、Debug、 FastDebug 等)的虚拟机)建议读者至少保证5GB以上的空余磁盘。 对系统的最后一点要求就是所有的文件包括源码和依赖项目都不要放在包含中文的目录里面这样做不是一-定不可以只是没有必要给自己找麻烦。 1.6.3构建编译环境 在MacOSe和Linux上构建OpenJDK编译环境比较简单(相对于Windows来说)对于Mac OS需要安装最新版本的XCode和Command Line Tools for XCode,在Apple Developer网站(https : //developer.apple.com/). 上可以免费下载 这两个SDK包提供了OpenJDK所需的编译器以及Makefle中用到的外部命令。另外还要准备一个6u14以上版本的JDK因为OpenJDK的各个组成部分(Hotspot、JDK API、JAXWS、JX......有的是使用C编写的更多的代码则是使用Java自身实现的因此编译这些Java代码需要用到-一个可用的JDK官方称这个JDK为“Bootstrap JDK。如果编译OpenJDK 7, Bootstrap JDK必须使用JDK6 Update 14或之后的版本笔者选用的是JDK7 Update 4。最后需要下载-一个1.7.1 以上版本的Apache Ant用于执行Java编译代码中的Ant脚本。对于Linux来说所需要准备的依赖与Mac OS差不多Bootstrap JDK和Ant都是- -样的在MacOS中GCC编译器来源于XCodeSDK而Ubuntu中GCC应该是默认安装好的需要确保版本为4.3以上如果没有找到GCC安装binutils即可在Ubuntu 10.10下编译OpenJDK 7u4所需的依赖可以使用以下命令- -次安装完成。 sudo apt-get install build-essential gawk m4 openjdk-6-jdk 1 ibasound2-dev libcups2-dev 1 ibxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev ant 1.6.4进行编译 现在需要下载的编译环境和依赖项目都准备齐全了最后我们还需要对系统的环境变量做一些简单设置以便编译能够顺利通过。OpenJDK在编译时读取的环境变量有很多但大多都有默认值必须设置的只有两个: LANG和ALT_ _BOOTDIR前者是设定语言选项必须设置为: export LANGC 否则在编译结束前的验证阶段会出现一个HashTable内的空指针异常。另外一个ALT_BOOTDIR参数是前面提到的Bootstrap JDK,在Mac OS上笔者设为以下路径其他操作系统读者对应调整即可。 export ALT_ BOOTDIR/Library/Java/JavaVirtualMachines/jdk1.7.0 _04.jdk/Contents/ Home 另外如果读者之前设置了JAVA_ HOME和CLASSPATH两个环境变量在编译之前必须取消否则在Makefile脚本中检查到有这两个变量存在会有警告提示。 unset JAVA_ HOME unset CLASSPATH 其他环境变量笔者就不再- -- 介绍了代码清单1-1给出笔者自己常用的编译Shell脚本读者可以参考变量注释中的内容。 代码清单1-1环境变t设f #语言选项这个必须设置否则编译好后会出现一个HashTable的NPE错   export LANGC #Bootstrap JDK的安装路径。必须设置 export ALT_BOOTDIR/Library/Java/ JavaVirtualMachines/jdk1.7.0_04.jdk/Contents/ Home 普允许自动下载依赖 export ALLOW_DOWNLOADStrue #并行编译的线程数设置为和CPU内核数量一致即可 export HOTSPOT_BUILD_JOBS 6 export ALT_PARALLEL_COMPILE_JOBS6 #比较本次build出来的映像与先前版本的差异。这对我们来说没有意义 #必须设置为false,否则sanity检查会报缺少先前版本JDK的映像的错误提示。 #如果已经设置dev或者DEV_ONLYtrue,这个不显式设置也行 export SKIP_COMPARE_IMAGEStrue #使用预编译头文件不加这个编译会更慢一些 export USE_PRECOMPILED_HEADERtrue #要编译的内容 export BUILD_LANGTOOLStrue #export BUILD_JAXP false . #export BUILD_JAXWSfalse #export BUILD_CORBA false : export BUILD_HOTSPOTtrue export BUILD_JDKtrue #要编译的版本 #export SKIP_DEBUG_BUILDfalse #export SKIP_FASTDEBUG_BUILDtrue #export DEBUG_NAMEdebug #把它设置为false可以避开javaws和浏览器Java插件之类的部分的build . BUILD_DEPLOYfalse #把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖 #但即便不build出它也已经能得到完整的JDK映像所以还是别build它好了 BUILD_INSTALLfalse #编译结果所存放的路径 export ALT_OUTPUTDIR/Users/IcyEenix/Develop/JVM/jdkBuild/openjdk_7u4/build #这两个环境变量必须去掉不然会有很诡异的事情发生(我没有具体查过这些“诡异的#事情Makefile脚本检查到有这2个变量就会提示警告) unset JAVA_HOME unset CLASSPATH make 21 | tee $ALT_OUTPUTDIR/build.1og全部设置结束之后可以输入make sanity来检查我们前面所做的设置是否全部正确。如果一切顺利那公几秒钟之后会有类似代码清单1-2所示的输出。 代码清单卡2 make sanity检查 ~/Develop/JVM/jdkBuild/openjdk_7u4$ make sanity Build .Machine Information: buird machine IcyFenix-RMBP.1ocaF Build Directory St ructure: CWD /Users/IcyFenix/Develop/JVM/jdkBuild/openjdk_7u4 TOPDIR _. LANGTOOES_TOPDIR ./langtools JAXP_TOPDIR ./jaxp JAXWS_TOPDIR ./jaxws CORBA_TOPDIR -./corba HOTSPOT_TOPDIR./hotspat JDK_TOPDIR ./jdk Build Directives: BUILD_LANGTOOLS true BUILD_JAXP true - - BUILD_JAXWS true BUILD_CORBA true BUILD_HOTSPOT true DEBUG ELASSFILES DEBUG BINARIES ....因篇幅关系中间省略了大量的输出内..... OpenJDK-specific settings: FREETYPE HEADERS_PATH - /usr/X11R6/include ALT_FREETYPE HEADERS_PATH FREETYPE LIB_PATH /usr/X11R6/lib ALT_FREETYPE_LIB_PATH Previous JDK Settings: PREVIOUS RELEASE PATH US ING-PREVIOUS_RELEASE_IMAGE ALT_PREVIOUS_RELEASE_PATH PREVIOUS_JDK_VERSION 1.6.0 ALT_PREVIOUS_JDK_VERSION PREVIOUS_JDK_FILE ALT_PREVIOUS_JDK_FILE PREVIOUS_JRE_FILE ALT_PREVIOUS_JRE_FILE PREVIOUS_RELEASE_IMAGE /Library/Java/JavaVirtualMachines/jdk1.7.0_04.jdk/ Contents / Home ALT_PREVIOUS_RELEASE_IMAGE Sanity check passed.  Makefile的Sanity 检查过程输出了编译所需的所有环境变量如果看到“Sanity check passed.,说明检查过程通过了可以输人“make执行整个OpenJDK编译( make不加参数默认编译make all)笔者使用Core i7 3720QM/ 16GB RAM的MacBook机器启动6条编译线程全量编译整个OpenJDK大概需20分钟编译结束后将输出类似下面的日志清单所示内容。如果读者之前已经全量编译过只修改了少量文件增量编译可以在数十秒内完成。 #-- Build times ---------- Target all_ _product_ build Start 2012-12-13 17:12:19 End 2012-12-13 17:31:07 00:01:19 corba 00:01: 15 hotspot 00:00:14 jaxp 00:7:21 jaxws 00:8:11 jdk 00:00:28 langtools 00:18:48 TOTAL 编译完成之后进入OpenJDK源码下的buildj2sdk-image目录(或者build-debug. build-fastdebug这两个目录)这是整个JDK的完整编译结果复制到JAVA_ HOME目录就可以作为- -个完整的JDK使用编译出来的虚拟机在-version命令中带有用户的机器名。 ./java -version openjdk version 1.7.0- internal- fastdebug OpenJDK Runtime Envi ronment (build 1 .7.0-internal- fastdebug- icyfenix_ 2012_ 12_ 24_ 15_ 57-b00) OpenJDK 64-Bit Server VM (build 23.0-b21- fastdebug, mixed mode) 在大多数时候如果我们并不关心JDK中HotSpot虚拟机以外的内容只想单独编译 HotSpot虚拟机的话(例如调试虚拟机时每次改动程序都执行整个OpenJDK的Makefile, 速度肯定受不了)那么使用hotspot/make目录下的Makefile进行替换即可其他参数设 置与前面是一-致的这时候虚拟机的输出结果存放在buildhotspot/outputdir/bsd_ amd64_ compiler2目录9中进人后可以见到以下几个目录。 0 drwxr-xr-x 15 IcyFenix staff 510B 12 13 17:24 debug 0 drwxr-xr-x 15 IcyFenix staff 510B 12 13 17:24 fastdebug 0 drwxr-xr-x 15 IcyFenix staff 510B 12 13 17:25 generated 0 drwxr-xr-x 15 IcyFenix staff 510B 12 13 17:24 jvmg 0 drwxr-xr-x 15 IcyFenix staff 510B 12 13 17:24 optimi zed 0 drwxr-xr-x 584 IcyFenix staff 19K 12 13 17:25 product 0 drwxr-xr-x 15 IcyFenix staff 510B 12 13 17:24 profiled 这些目录对应了不同的优化级别优化级别越高性能自然就越好但是输出代码与源码的差距就越大难于调试具体哪个目录有内容取决于make命令后面的参数。在编译结束之后、运行虚拟机之前还要手工编辑目录下的env.sh文件这个文件 由编译脚本自动产生用于设置虚拟机的环境变量里面已经发布了“JAVA_ HOME、CLASSPATH、HOTSPOT_BUILD_ USER 3个环境变量还需要增加一个“LD_ LIBRARY_PATH内容如下: LD_LIBRARY_PATH.:${JAVA_ HOME}/jre/lib/amd64/native_.threads:$ {JAVA_HOME}/jre/ 1ib/amd64: export LD_LIBRARY_PATH ; 然后执行以下命令启动虚拟机(这时的启动器名为gamma),输出版本号。 ../env.sh ./gamma -version Using java runtime at: /Library/Java/JavaVirtualMachines/jdk1.7.0_04.jdk/ Contents/Home/jre java version 1.7.0_04 Java (TM) SE Runtime Environment (build 1.7.0_04-b21) OpenJDK 64-Bit Server VM (build 23.0-b21, mixed mode)在不同机器 上最后一个目录名称会有所差别bsd表示Mac oS系统(内核为FreeBSD) , amd64表示是 64位JDK (32位是x86)compiler2表示是Server VM (Client VM表示是compiler1) . 看到自己编译的虚拟机成功运行起来很有成就感吧! 1.6.5 在IDE工具中进行源码调试 在阅读OpenJDK源码的过程中经常需要运行、调试程序来帮助理解。我们现在已经可以编译出一个调试版本HotSpot虚拟机禁用优化并带有符号信息这样就可以使用GDB来进行调试了。据笔者了解许多对虚拟机了解比较深的开发人员确实就是直接使用GDB加VIM编辑器来开发、修改HotSpot的不过相信大部分读者更倾向于在IDE环境而不是纯文本的GDB下阅读、跟踪HotSpot源码因此这节就简单介绍一-下“如何在IDE中进行HotSpot源码调试。首先到NetBeans网站(http://netbeans.org/) 上 下载最新版的NetBeans,下 载时选择支持C/C开发的那个版本。安装后新建-一个项目选择“基于现有源代码的C/C项 目”在源码文件夹中填入OpenJDK目录下hotspot目录的路径在下面的单选按钮中选择“定制”如图1-8所示然后单击“下一步”按钮。 接着在“指定构建代码的方法”中选择“使用现有的makefile,并填人Makefile文件的路径(在hotspot/make目录下)如图1-9所示。单击“下一步”按钮将“构建命令”修改为以下内容:  ${MAKE} -f Makefile clean jvmg ALT_ BOOTDIR/Library/Java/JavaVirtualMachines/jdk1.7.0_ 04. jdk/ Contents/ Home ARCH_ DATA_ MODEL64 LANGC OpenJDK 7u4源码Makefile在终端运行时能正确获取到系统指令集架构为64位但在NetBeans中却没有取得正确的值误认为是32位因此这里必须使用ARCH_ DATA_MODEE参数明确指定为64位。另外两个参数ALT_ _BOOTDIR和LANG的作用前面已经介绍过。单击“完成”按钮HotSpot 项目就这样导人到NetBeans中了。不过这时候HotSpot还运行不起来,因为NetBeans根本不知道编译出来的结果放在哪里、哪个程序是虚拟机的入口等这些内容都需要明确告知NetBeans。在HotSpot工程上单击右键 在弹出的快捷菜单中选择“属性”在弹出的对话框中找到“运行”选项设置运行命令为: /Users/IcyFenix/Develop/JVM/jdkBuild/openjdK_7u4/hotspot/build/bsd/bsd_amd64_compiber2/ j-vmg-/gamna Queens 上面的Queens是MaKefile脚本自动产生的一段解八皇后问题的Java程序用壬测试虚拟机这里笔者直接拿来用了读者完全可以将它替换为自己的Java程序。读者在调试Java代码执行时如果要跟踪具体Java代码在虚拟机中是如何执行的也许会觉得无从下手因为目前在HotSpot主流的操作系统上都采用模板解释器来执行字节码它与HT编译器-样最终执行的汇编代码都是运行期间产生的无法直接设置断点所以HotSpot增加了以下参数来方便开发人员调试解释器。 -XX: TraceBytecodes - XX:StopInterpreterAtn 这组参数的作用是当遇到序号为n的字节码指令时便会中断程序执行进人断点调试。在调试解释器部分代码时把这两个参数加到gamma后面即可。最后还需要在“环境”窗日中设置环境变量也就是前面env.sh脚本所设置的那几个环境变量如图1-10 所示。 完成以上配置之后一个可修改、编译、调试的HotSpot工程就完全建立起来了启动器的执行入口是java.c的main()方法读者可以设置断点单步跟踪如图1-11所示。 由于HotSpot的源码比较长C/C 文件数量也很多为了便于读者阅读所以代码清单1-3给出了各个目录中代码的主要用途供读者参考。  1.7 本章小结 本章介绍了Java技术体系的过去、现在以及未来的一些发展趋势并通过实战介绍了如何自己来独立编译-一个OpenJDK 7.作为全书的引言部分本章建立了后文研究所必需的环境。在了解Java技术的来龙去脉后后面章节将分为4部分去介绍Java在内存管理、Class文件结构与执行引擎、编译器优化及多线程并发方面的实现原理。
http://www.zqtcl.cn/news/874843/

相关文章:

  • zeronet网站开发安徽建筑大学学工在线网站
  • wordpress文章自动更新关键词seo优化软件
  • 网站的备案流程图python是做网站的吗
  • 网站搭建合同怎么快速优化关键词排名
  • 什么网站可以做推广百度登录入口
  • 公司备案网站负责人是谁刷网站关键词工具
  • 比较好的建立站点网页美工设计从入门到精通
  • 新手做网站流程网店推广计划怎么写免费的
  • 怎么建造自己的网站朋友圈推广文案
  • 用什么程序做网站潍坊做电商的网站
  • 雅客网站建设网站如何挂马教程
  • 手机网站开发兼容性wordpress下载主题footer
  • 资讯网站模板带会员投稿功能怎么查网站开发的语言
  • 个人网站搭建平台wordpress免费还是收费
  • 网站优化协议嘉兴企业网站设计哪家好
  • 英文网站设计哪家好用php做的网站用什么数据库
  • 公司网站建设包括服装设计公司效果图
  • 做网站怎么购买主机下载安装百度一下
  • wordpress网站 搬家大型网站开发什么书籍好
  • 机关事业单位 网站建设方案书网站推送怎么做
  • php网站如何绑定一级域名到子目录做推广便宜的网站
  • 江苏省网站建设与管理历年自考试题商城网站 价格
  • 淘宝客网站建站源码icp备案查询官网入口
  • 环球资源网站网址微信管理中心
  • 青岛seo建站企业网址下载
  • 开发网站多少钱一个月做网站宽度
  • wordpress企业站主题哪个好做床上用品网站
  • 宜兴市做网站网站建设简讯
  • 点的排版设计网站音乐网站网页设计
  • 牛商网做网站的思路建设网站的机构