在Linux下编译OpenJdk并调试Hotspot

关于linux平台下用gdb调试so动态库 在linux平台下的程序写了很多,但是调试感觉不是很熟悉。这几天专门去学习了一把,搞了一下so的调试。首先给出两个源文件,即调用程序和被调用动态库程序的源代码。调用程序源代码:main.cpp#include #include #include #include int main(){    void *dlh=NULL;    int (*printmsg)(char *pMsg);   阅读详情
背景

对于大多数Java程序员来说,JVM就是一个黑盒子,我们一般不必关心它内部是怎么运作的。但是万一碰到JVM bug导致的Crash呢,又或者只是因为好奇想了解JVM的内部世界,那么就需要编译和调试JVM。

概念

1. JVM(Java Virtual Machine)

       翻译过来就是Java虚拟机,所谓虚拟机是相对传统的计算机而言的。

       传统的计算机有很多体系架构,比如x86,Sparc等等;一个体系架构一般有类似的指令集,比如586兼容所有386的指令集,但是又有自己扩充的指令。在Java出现之前,大部分编译型语言(我不知道是不是所有的)都会由编译器把源代码编译成特定机器下特定指令集的机器指令。从理论上来说所有的机器的表达能力都是一样的,等价于图灵机这个理论模型。但是就具体实现而言,在不同机器实现同一个逻辑的机器指令是不同的,这就导致在一台机器编译的二进制文件可能无法在另一台机器上运行(这里不考虑操作系统的差异)。当然写得比较好的c代码是可以在不同平台编译,但是一般不太可能把一个windows下的exe程序让linux运行。(当然除了机器指令的差别,不同系统的二进制格式也是不能兼容的,比如windows pe和linux elf)。即使同一个操作系统,比如linux,在x86下编译的程序也是没办法在Sparc下跑的,因为Sparc根本不认识x86的指令。

       JVM就是一个虚拟机,它定义了自己的指令集(Java字节码),所有的Java程序编译成统一的字节码,然后JVM负责在不同的硬件和操作系统下解释或者编译字节码。

       JVM本身只是一个概念,一种抽象

2. JRE(Java Runtime Environment)

       Java运行时环境,首先必须实现JVM规范,实现同样的JVM规范可以有很多方法,比如Sun有Sun的实现,IBM有IBM的实现。

       JVM当然得实现Java语言,也就是java.lang.*,认识int,知道class,方法,...

       但是如果你发现没有java.util.* 或者没有java.io.*时,是不是会发现没法写Java程序了呢?

       没有util,你当然可以自己实现那些常见的数据结构,这可以用java实现;那没有io呢?那似乎没法写出跨平台的代码了。

       所以除了实现语言本身,Java还定义了很多跨平台的API,比如java.awt java.io等等。这些可能是我们非常常用的,所以Sun把它们叫作了Java Standard Edition(Java SE)。一般以java开头

       另外有些API,比如JDBC,这是连接数据库的API。这些组成了Java Enterprise Edition(Java EE)。一般以javax包开头

       这些API有些是用Java实现,但很多不跨平台的必须由C实现(JVM通过JNI规范来实现Java和c的数据传递),所以JRE必须实现这些

3. JDK(Java Development Kit)

*       *开发者的工具,最常用的就是javac编译器。和vc或者gcc一样,必须要有工具把源代码编译成目标代码,c的目标代码是机器相关的,而Java的目标代码就是字节码。

*       *当然实现javac就是实现一个传统的编译器,词法分析,语法分析和语义分析,然后翻译成字节码。这本身不是件简单的事情,所以编译器的开发者也开发了一些帮助开发编译器的工具,比如我们熟悉的lex/flex,yacc/bison。java也实现了类似的JavaCC和JFlex。

       除了javac,javadoc和javah也是很常用的工具。此外Java的新特性,比如范型(Generics)和注解(Annotations),这些也需要由编译器来处理。(范型只影响编译,编译后被擦除了,但是Annotation可能会运行时能通过反射获取)。这些代码一般都是Java实现,打包到tools.jar。所以如果你需要动态编译Java代码(比如JSP),那么你可能要用到tools.jar

Linux下Build Open Jdk 7和Debug Hotspot

      下面的内容大部分参考下面两篇文章:

        http://weblogs.java.net/blog/simonis/archive/2008/01/hotspot_develop.html

        http://weblogs.java.net/blog/simonis/archive/2008/01/hotspot_develop_1.html

       不过在用NetBeans调试Hotspot时碰到了一些问题(可能是我用了比较新的netbeans的缘故),之前问过作者,不过没有得到满意的解答,后来自己使用了一些trick的手段。

1. 获取源代码

       两种方法

       1.1 使用 Mercurial 获取最新代码(其实就是svn git这样的scm工具)

             http://hg.openjdk.java.net/jdk7/build/raw-file/tip/README-builds.html

             速度比较慢,可能要花几个小时吧,如果你需要最新代码又不想等,可以找我

       1.2 直接下载压缩的源代码包

             http://download.java.net/openjdk/jdk7/

             解压后就可以了,如果想更新代码,也可以运行 sh ./getSource.sh更新

        1.3 源代码结构

             hotspot

                  hotspot的源代码,完整的工程,包括makefile,文件按平台分类,比如 hotspot/src下有4个目录:os cpu os_cpu share

                  很明显,share放的是于平台无关的代码,os里放的是特定os的代码,cpu放的是特定cpu的代码,os_cpu放的是特定os和cpu的代码

             jdk 

                  java api的代码,如果我们对jdk的代码感兴趣,比如想看ConcurrentHashMap的实现,那么可以去src/share/classes/java/util/concurrent/ConcurrentHashMap.java

                  它的目录结果是 share,linux,solaris和windows,和前面类似,share放的是操作系统无关的代码,一般是用Java实现。Windows当然放的是windows的实现,不过*nix的都是放到solaris下实现的,不同的操作系统通过不同的#define区别,所以大部分代码都在solaris下,linux目录下只有一些文档。大部分代码都是c实现,然后通过JNI让java调用,所以大部分代码都在native下而不是classes下。
             langtool
                  编译器工具,比如javac,javah,apt等等工具
             make 
                  makefile
             其它
                  比如jaxp,corba等等,暂时不感兴趣
./share/classes/java/util/concurrent/ConcurrentHashMap.java

2. 编译和调试

         大部分应该都装好了,比如gcc,make,ant,bootstrap jdk,还有一些需要安装,比如cups等Sun没有版权的代码,你必须自己从网上下载(或者通过Linux发行版的仓库安装)

         由于我的机器很早以前编译的,当时编译时少一个装一个,所以忘了要装哪些了,碰到问题的可以google,也可以找我讨论(我也可能解决不了,我对Linux也不是很熟悉)

         可以使用 make sanity 测试,请设置如下的环境变量(我的是bash):       

export LANG=C
unset JAVA_HOME
export ALT_BOOTDIR=/home/lili/java/jdk1.6.0_26/
export ALLOW_DOWNLOADS=true
export USE_PRECOMPILED_HEADER=true
export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=true
export DEBUG_NAME=debug 

  2.1 编译JDK

         如果make sanity通过,那么直接运行 make,如果你想保留日志,那么可以 make 2>&1 |tee ~/buildopenjdk7.log

         可能会碰到问题,需要你解决。如果顺利的话,几个小时后应该能编译好。

   2.2 编译结果

          费了这么大的力气,我们看看编译的成果。

          编译的结果放到了build/linux-i586-debug下,

              bin

                  编译后的二进制文件,比如java,javac等等

              lib

                  jar包,比如tools.jar

               hotspot

                  我们最感兴趣的jvm,具体运行和调试会在下面介绍

               classes

                  java api部分,包括按包组织的java类

   2.3  运行一下自己编译的jdk               

lili@lili-desktop:/media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image$ ./bin/java -version
openjdk version "1.7.0-internal-debug"
OpenJDK Runtime Environment (build 1.7.0-internal-debug-lili_2011_11_14_12_30-b00)
OpenJDK Server VM (build 21.0-b17-jvmg, mixed mode)
lili@lili-desktop:/media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image$

   2.4  编译hotspot      

        前面说过了,我们感兴趣的是hotspot。如果想学习util里的实现,直接能看java代码,如果想学习io或者nio,那么可以直接看native c的实现(java通过JNI调用)。

        比如我们修改了hotspot的代码,当然可以重新编译整个JDK,但这太慢,我们可以只重新编译hotspot自己

        环境变量和前面一样,需要ALT_BOOTDIR和ALT_OUTPUTDIR

        使用:cd hotspot/make && make jvmg jvmg1       

         target jvmg会编译Server版本的Hotspot,并且是带调试符号的,jvmg1会编译Client版本的,同样也是带调试符号的。因为优化可能会调整代码顺序或者去掉一些无用的代码等,这会给调试带来困难,所以如果我们是为了学习的话,用这两个target就好了。

         如果需要优化的版本可以用target optimized或者optimized1,同样后面有1的表示Client;产品的target是product和product1

  2.5 运行hotspot

*         *需要增加两个环境变量LD_LIBRARY_PATH和JAVA_HOME,前者参考下面,里面包含我们编译好的libjvm.so,后者可以用我们自己编译的jdk

export LD_LIBRARY_PATH=/media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg
export JAVA_HOME=/media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image
cd /media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg
lili@lili-desktop:/media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg$ ./gamma -versionlili@lili-desktop:/media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg$ ./gamma -version
Using java runtime at: /media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image/jre
openjdk version "1.7.0-internal-debug"
OpenJDK Runtime Environment (build 1.7.0-internal-debug-lili_2011_11_14_12_30-b00)
OpenJDK Client VM (build 21.0-b17-internal-jvmg, mixed mode)Using java runtime at: /media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image/jreopenjdk version "1.7.0-internal-debug"
OpenJDK Runtime Environment (build 1.7.0-internal-debug-lili_2011_11_14_12_30-b00)
OpenJDK Client VM (build 21.0-b17-internal-jvmg, mixed mode

2.6 使用gdb调试hotspot

         前面我们编译出来的hotspot已经是带有调试符号,所以可以使用gdb来调试了。

gdb ./gamma


GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
........
(gdb) break main
(gdb) r
Starting program: /media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg/gamma
[Thread debugging using libthread_db enabled]


Breakpoint 1, main (argc=1, argv=0xbffff1a4)
    at /media/d/openjdk7zip/openjdk/hotspot/src/share/tools/launcher/java.c:228
228 {
(gdb) (gdb)        

    可以看到,gamma测试程序的入口是hotspot/src/share/tools/launcher/java.c。

  2.7 使用Netbeans调试hotspot  

      对于习惯GNU/Linux环境开发的c程序员来说,有源代码和Makefile,再配合vim或者emacs,使用它们的插件比如cscope来阅读代码,gdb来调试程序,是件很自然的事情。

      不过对于习惯的IDE的Java程序员来说,这确实有的不爽。估计Sun的人也是这样的,所以他们内部是使用Netbeans来调试hotspot的。

      HotSpot development on Linux with NetBeans - Part 2 这篇blog是基于Netbeans6,里面很多都是为了解决nb的bug,我使用的是Netbeans7,所以很多bug已经修正。

       2.7.1 NB项目设置

          新建项目->C/C+->基于现有源代码的C/C+项目

          指定包含源代码的目录:/media/d/openjdk7zip/openjdk/hotspot,由于makefile不在这个目录下,而是在它的子目录下,所以选择“定制”模式。

          然后选择好Makefile的位置。下一步进入build的配置

          make的工作目录是make,

          生成命令是${MAKE} -f Makefile jvmg,          

         清理命令是${MAKE} -f Makefile clean,

          生成结果填写一个目录就可以了。

          然后点击确定就会buildhotspot,不过这样会出现问题,因为缺少ALT_BOOTDIR环境变量,但是Netbeans好像只能设置运行时的环境变量,而不能设置build时的环境变量,参考

这篇文章 http://forums.netbeans.org/post-40251.html。我折腾了好久也没有搞定,最后也没搞定。最后只能使了个毛招:         

因为它默认去/java/re/j2se/1.6.0/latest/binaries/linux-i586找jdk,所以可以建个符号链接

lili@lili-desktop:/java/re/j2se/1.6.0/latest/binaries$ ll linux-i586
lrwxrwxrwx 1 lili lili 28 Nov 14 18:14 linux-i586 -> /home/lili/java/jdk1.6.0_26/

           这下可以点击确定,让它build。

       2.7.2 删除“无用”的文件

           因为hotspot是跨平台的项目,前面可以看到针对不同的平台会有不同的实现,但是很多文件是相同的,比如文件名相同,因此同一个方法可能在linux里有个实现,windows有个实现,

           这样NB就不知道到底会是哪个了,这会对Code Assistance带来影响,另外我们查看定义也会带来问题。所以针对Linux平台,我们可以在NB里删除不需要的文件(这不是删除磁盘上的文件,而是在NB里删除)

           可以删除的目录:               

   hotspot/agent/src/os/solaris
hotspot/agent/src/os/win32
hotspot/agent/src/share/native/jvmdi
hotspot/src/cpu/sparc
hotspot/src/os/solaris
hotspot/src/os/windows
hotspot/src/os_cpu/solaris_sparc
hotspot/src/os_cpu/solaris_x86
hotspot/src/os_cpu/windows_x86
hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp
hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp

          可以删除的文件(我的机器是x86,所以把x86-64的那些文件可以删掉):

    hotspot/src/cpu/x86/vm/assembler_x86_64.cpp
hotspot/src/cpu/x86/vm/assembler_x86_64.hpp
hotspot/src/cpu/x86/vm/assembler_x86_64.inline.hpp
hotspot/src/cpu/x86/vm/dump_x86_64.cpp
hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp
hotspot/src/cpu/x86/vm/interp_masm_x86_64.hpp
hotspot/src/cpu/x86/vm/interpreterRT_x86_64.cpp
hotspot/src/cpu/x86/vm/interpreter_x86_64.cpp
hotspot/src/cpu/x86/vm/jniFastGetField_x86_64.cpp
hotspot/src/cpu/x86/vm/runtime_x86_64.cpp
hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp
hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp
hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp
hotspot/src/cpu/x86/vm/templateTable_x86_64.hpp
hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp
hotspot/src/cpu/x86/vm/vm_version_x86_64.hpp
hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp
hotspot/src/cpu/x86/vm/x86_64.ad
hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_64.cpp
hotspot/src/os_cpu/linux_x86/vm/linux_x86_64.ad
hotspot/src/os_cpu/linux_x86/vm/linux_x86_64.s

     2.7.3 在NB里调试

           修改项目属性->运行

              运行命令:"{OUTPUT_PATH}" -XX:StopInterpreterAt=1 -version (如果想调试某个Java类,那么配好-classpath和类名)

              运行目录:make

              环境变量:配置好JAVA_HOME和LD_LIBRARY_PATH

           在java.c的main里头加个断点

           右键点击项目->调试

      have fun ~ 

【C++】小猫钓鱼纸牌游戏--C++实现 小猫钓鱼问题: 描述:初始,两个人各有n张牌(牌面0-10),顺序固定,只能按顺序出牌。然后,两个人轮流在桌面上以接龙的方式出牌,当某个人放置的牌在桌面上已经出现时,他收起相同牌面及其中间的牌作为自己的筹码,同时需要再放一张牌到桌面。某人手上的牌出完后,另一个人继续出,直到两人手上都没牌为止,输出结束时两个人手上的筹码数。 #include<iostream> using namespace std; struct queue { int head; //队列首 int tail; // 阅读详情

相关推荐

点云配准实战:用DGCNN+Transformer+SVD搞定3D模型对齐(附PyTorch代码)

本文详细介绍了基于深度学习的点云配准实战方法,重点解析了Deep Closest Point (DCP)模型。该模型融合了DGCNN、Transformer和可微分SVD三大核心模块,能够端到端地预测点云间的刚性变换,有效克服传统ICP算法对初始位置敏感、易陷入局部最优的缺点。文章提供了完整的PyTorch代码实现、ModelNet40数据集处理、训练策略及显存优化技巧,旨在帮助开发者在机器人、自动驾驶等领域实现精准的3D模型对齐。

weixin_29061041的博客 153

1. 编译、调试HotSpot VM 8

编译、调试JDK8 的完整记录,内附出错记录。

FTC9527’s Blog 1893

滤波算法-呼吸心跳信号检测方法(四)

呼吸心跳信号检测系列文章:信号滤波处理

yjh_2019的博客 6269

【爱上Java8】使用gdb调试jvm,观察轻量级锁的获得

阅读本文前,你需要对轻量级锁有所了解。轻量级锁在ObjectSynchronizer::slow_enter里尝试获取,所以要先加个断点。 当他进来的时候,可以看到: 1 2 3 Breakpoint 2, ObjectSynchronizer::slow_enter (obj=..., lock=0x7ffff7fe16e8, __the_thr

爱上Java8 1254

Unity3d实现红外热成像效果

1.将需要在红外图像中高亮的物体设置到图层PostProcessing。 2.新建一个相机CameraHighLight,设置其Culling Mask为PostProcessing,也就是在这个相机中只有PostProcessing图层的物体可见。 3.新建一个RenderTexture,命名为HightLightRt,将CameraHighLight的Target Texture设HightLightRt。 4.新建一个相机Camera2,这个相机用于显示其他物体。 接下来将CameraHigh

zouxin_88的专栏 8327

Python + Google AI 自动修复 Sonar Bug 实践

在工作中总会遇到种种不期而至的需求,比如前段时间突然要修复所有 Sonar Bug,涉及各种琐碎的代码风格问题,包括但不限于语法不规范、废弃注释等问题。这些项目都已经持续开发几年了,Sonar 上的问题层出不穷,各种问题已经累积到了上万个,手动修复不但费时费力,而且过程异常枯燥。

子洋 Blog 2415

gdb调试运行程序带参数(调用动态链接库),debug过程记录

1.gdb (运行程序名称)例如gdb cbenchmark2.设置运行参数set args -c 1 -n 1 -F ./libaliww.so -l 13.如果是多线程程序set follow-fork-mode child4.设置断点,如果代码是动态链接库.so中的代码系统会提示如提示1b CWWSimulator.cpp:530提示1:No source file named CWWSimulator.cpp. Make breakpoint pending on future shared li

测试开发这些事 3035

深入解析fio Benchmark测试:从源码到实践

本文深入解析fio Benchmark测试工具,从入门指南到源码架构分析,详细介绍了其核心模块、关键数据结构和I/O处理机制。通过实战案例展示如何优化存储性能测试,包括内存对齐、多线程调优等技巧,帮助开发者充分利用fio进行精准的存储性能评估。

weixin_42563415的博客 207

GDB调试android 的lib.so的一些体会

首先是习惯了IDE界面,在gdb命令下真的不方便。gdb调试这前是用ndk-build编译。.so。用ndk-build编译编译时,在JNI的调用用中比如 public native String stringFromJNI(); 这个函数在代码编辑中会显示找不到的错误。 build就是了,不要管它。ndk-build和AS的容合没有CMAKE做的好。要写代码的自已保证名字参数的一致性,如非必要还...

qushaobo的专栏 919

减小伺服电机共振的方法(以松下伺服为例)

嘿 ! 我是【小黄】 , 我们又见面啦 !!! 毕竟技术只有大家交流才会进步嘛 ! 这博客是对自己学习的一点点记录和总结 ,如果您对自动控制感兴趣的话 ,可以关注一下我的动态 , 我们一起学习呀 ! 我们都还年轻 ,我们还有无限可能 。 YES ! 减小伺服电机共振的方法(以松下伺服为例)1. 准备工作:1.1.1 如何推定共振点:1.1.2 测定实操:1.1.3 总结:2. 下期预告: 在我们调试完伺服参数以后机器人运动到某个特定位置会产生振动或异响,我们要做的就是消除这个异响保..

在下小黄的博客 1万+

大学计算 - 方程求解 实训答案 第3关

【代码】大学计算 - 方程求解 实训答案 第3关。

2403_89314916的博客 106

[转]在Linux下编译OpenJdk并调试Hotspot

背景 对于大多数Java程序员来说,JVM就是一个黑盒子,我们一般不必关心它内部是怎么运作的。但是万一碰到JVM bug导致的Crash呢,又或者只是因为好奇想了解JVM的内部世界,那么就需要编译和调试JVM。 概念 1. JVM(Java Virtual Machine) 翻译过来就是Java虚拟机,所谓虚拟机是相对传统的计算机而言的。 传统...

weiwangweiwang的博客 310

《UDS协议从入门到精通(UDS速查手册)》(完结撒花版)

专栏总目录,文中介绍了UDS协议相关的基础知识和一些术语,给出了详细介绍6大类26种服务的跳转目录。

车载系统攻城狮 9万+

Linux下编译OpenJDK源码以及在Eclipse中调试Hotspot虚拟机

Linux下编译OpenJDK源码以及在Eclipse中调试Hotspot虚拟机

leonliu06的博客 5070

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

OpenJDK源码调试

NetBeans调试HotSpot源码

BlackAngle 729

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

如何从零开始构建OpenJDK:Java开发者的完整编译指南

OpenJDK是Java开发工具包(JDK)的开源实现,为Java开发者提供了完整的开发环境。作为Java生态系统的核心,掌握OpenJDK的构建技能不仅能让你深入了解Java运行时的内部机制,还能为定制化JVM、性能优化和平台适配打下坚实基础。本文将带你从源码获取到完整构建,一步步掌握OpenJDK的编译技巧。 ## 项目核心亮点:为什么要自己构建JDK 1. **深度理解Java运行时**

gitblog_00649的博客 453

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

手把手编译可调试OpenJDK:从GDB跟踪System.out.println开始

JVM内存模型与字节码执行机制是Java高性能调优和深度面试的核心基础。理解其原理需超越概念背诵,深入HotSpot源码的可执行上下文——即具备调试符号、禁用优化、支持GDB单步的活体JVM。OpenJDK编译本质是跨语言构建工程,依赖特定版本GCC、CMake与Ninja,并需正确配置--enable-debug和-g3等关键参数,才能生成带完整符号表的libjvm.so。唯有如此,才能真实观测System.out.println触发的JNI调用链、解释器字节码分发、Metaspace方法解析及G1内存页

weixin_31856057的博客 278

使用Netbeans开发调试OpenJDK中的HotSpot

编译OpenJDK请看我上一篇文章RedHat/CentOS linux 6 环境编译openJDK7一、下载并安装Netbeans 7.0.1 (c/c++) http://share.weiyun.com/6292e450ed1c88423812e268f355a108 或者官网下载https://netbeans.org/community/releases/70/ ps:之所以使用7.

潘建南的博客 7085

编译及调试OpenJDK 8

看了深入理解Java虚拟机:JVM高级特性与最佳实践(第2版) 之后决定自己编译一下OpenJDK,但是书中介绍的关于编译和调试部分已经过时了。所以根据搜索的资料,自己编译调试了一下。IDE:Netbeans 8.2(最新版本即可) 操作系统:Ubuntu 14.04 源代码:OpenJDK 8编译OpenJDK 8下载源代码我是直接下载打包好的源代码(使用hg下载还需要再安装hg,这个东西相对

pcsxk的专栏 8126

Linux构建JVM(HotSpot) 源码调试环境(OpenJDK8)

一、准备环境 1.1、服务器资源 操作系统:CentOS 6.8 x64 二、下载源码(OpenJDK8) yum 源使用的是阿里的 https://opsx.alibaba.com/mirror?lang=zh-CN 这里使用 mercurial(类似 Git 的版本控制系统) 下载源码,方便更新。 安装hg服务 yum install mercurial -y 使用hg下载jdk8u源码到/opt目录 hg clone http://hg.openjdk.java.net/jdk8u/

qq_24101357的博客 8万+

Linux下编译并且调试OpenJDK12

前言:建议尽量在Linux或者MacOS上构建OpenJDK,这两个系统在准备构建工具链和依赖项上比Windows上容易的多。此次我在VMware workstation pro 15虚拟机中安装Ubuntu 18.04 LTS为平台构建。官方文档要求编译OpenJDK至少2~4GB的内存空间,至少6~8GB的空闲磁盘空间。本人建议虚拟机分配至少30GB磁盘空间。因为我编译完JDK和构建编译环境还...

xingxingeyes的博客 2111

HotSpot 源代码编译

编译环境 Windows10,VMware15,Ubuntu18.04, 虚拟环境。 PC机,内存32G,CPU 16 核心,I7八代。 Ubuntu18.04 虚拟机。 环境准备 安装Boot JDK,下载Linux版Oracle JDK8,解压安装到/usr/lib下, 执行 gedit ~/.bashrc 文件末尾追加如下 export JAVA_HOME=/usr/lib/jd...

Sherlock的博客 2492

Liunx环境编译调试OpenJDK

LIunx 环境OpenJDK 编译调试

d1451545368的博客 702

编译可调试的openjdk8u

一、编译openjdk 1. 环境准备 VMware Workstation Pro + Ubuntu 2. 下载openjdk8u源码 GitHub - openjdk/jdk8u: https://wiki.openjdk.java.net/display/jdk8u 3. 下载引导jdk7 Java Platform, Standard Edition 7 ReferenceImplementations 4. 安装引导jdk7 vim ~/.bashrc 增加环境变量:

譚潇逺的博客 1123

《深入理解java虚拟机》第1章:从零开始编译 OpenJDK 7 源码

1.6实战:自己编译JDK 想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译- -套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理,虽然门槛会高一点,但肯定会比阅读各种书籍、文章更加贴近本质。另外,JDK中的很多底层方法都是本地化(Native) 的,需要跟踪这些方法的运作或对JDK进行Hack的时候,都需要自己编译套JDK。现在网络上有不少开源的JDK实现可以供我们选...

ywl470812087的博客 11万+
上一篇: 一个group里查找topN行的sql
下一篇: mvn编译有Annotation的java时的奇怪错误
fancyerII
博客等级 码龄23年 48粉丝 164原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值