在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 ~ 

2024最新超详细无痛安装PyTorch,包括下载地址、环境配置与各种避坑指南 PyTorch更新很快,2024最新下载安装经验贴,包括anaconda+CUDA+cuDNN+PyTorch四部分的下载和安装。文章详细介绍了下载地址、环境配置、虚拟环境建立的问题,还温馨提示了各种闭坑指南。有需要的友友快过来康康! 阅读详情

相关推荐

Ubuntu视频播放器怎么选?VLC、mpv、SMPlayer硬解与字幕配置指南

在Linux系统中,视频播放体验取决于播放器、解码器与显卡驱动的协同。硬件解码通过VA-API或VDPAU将解码任务交给GPU,能显著降低CPU占用,解决4K高码率视频卡顿问题。对于Ubuntu用户,合理配置解码环境与播放器,可流畅播放HEVC、多音轨及ASS特效字幕视频。无论是日常观影、番剧追更还是家庭影院场景,选择合适的播放器并正确启用硬解,都是提升体验的关键。本文围绕Ubuntu平台,详解VLC、mpv、SMPlayer等播放器的安装、硬解配置与常见问题排查,帮助你在Linux上获得流畅的本地视频播放

weixin_33801856的博客 506

1. 编译、调试HotSpot VM 8

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

FTC9527’s Blog 1893

基于大模型的肾结石诊疗全流程风险预测与方案制定研究报告

目录一、引言1.1 研究背景与意义1.2 国内外研究现状1.3 研究目标与内容二、大模型技术原理与应用概述2.1 大模型的基本原理2.2 大模型在医疗领域的应用进展2.3 适用于肾结石预测的大模型选择与依据三、术前风险预测与准备3.1 患者身体状况评估3.2 结石情况分析3.3 术前准备方案制定四、术中风险预测与应对4.1 出血风险预测与处理4.2 脏器损伤风险预测与预防4.3 实时监测与决策支持五、术后恢复预测与护理5.1 恢复时间预测5.2 护理要点与措施5.3 并发症预防与处理六、并发症风险预测与管理

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1147

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

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

爱上Java8 1254

【LCMM实战指南】从增长混合模型到潜在类别轨迹分析的纵向数据建模

本文深入解析了LCMM(潜在类别混合模型)在纵向数据建模中的应用,对比了LCGA与GMM的核心差异与选择策略。通过R语言lcmm包的实战演练,详细展示了从数据模拟、模型拟合、类别数选择到结果解读的全流程,为识别数据中不同的发展轨迹亚型提供了系统指南。

weixin_29070861的博客 379

USB3.0 Type-B连接器SSTX/SSRX信号定义常见错误与硬件设计避坑指南

本文详细解析了USB3.0 Type-B连接器中SSTX/SSRX信号的定义标准与常见设计错误。针对连接器厂商图纸可能出现的信号标识错误,提供了实用的排查方法和硬件设计避坑指南,帮助工程师避免因引脚定义颠倒导致的通信降级或故障,确保USB3.0高速传输的稳定性。

gg901的博客 1265

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

从模组到集装箱:手把手拆解一个储能BMS的软硬件架构设计与通信组网

本文深入解析储能BMS的软硬件架构设计与通信组网,从电芯采样到系统集成的全链条技术实现。详细介绍了三级硬件架构(AFE、CMU、BMU)的设计要点,以及软件分层实现中的驱动层、应用层核心算法和通信协议栈。通过实战案例分享CAN网络搭建、调试工具链和系统验证测试经验,为储能系统开发提供实用指导。

weixin_30752699的博客 462

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

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

qushaobo的专栏 919

Vue - 解决报错 Error: Cannot find module ‘XXX\@vue\cli-service\bin\vue-cli-service.js‘(vue项目编译运行出错,启动失败)

vue报错,Error: Cannot find module ‘@vue\cli-service\bin\vue-cli-service.js‘,vue2项目启动报错,vue3项目运行出错,vue执行npm run serve报错,找不到@vue/cli-service模块,vue项目关于:Error: Cannot find module ‘D:\@vue\cli-service\bin\vue-cli-service.js‘的解决方案,vue项目跑不起来了,Vue项目报错,跑项目报错Cannot fi

🏆 前端领域优质创作者 3115

【异常】OpenClaw LLM请求超时故障全链路排查与解决方案 LLM request timed out. 网络连接超时了

摘要: OpenClaw LLM请求超时故障是高频网络交互问题,表现为客户端在预设时间内未收到服务端响应。根因分为四类:客户端配置缺陷(如超时阈值不合理)、网络链路异常(防火墙拦截等)、服务端问题(限流/宕机)及硬件瓶颈(算力不足)。解决方案分三步: 通用排查:检查网络连通性、关闭防火墙/代理校验,调整超时阈值至60-300秒; 分场景修复:云端API需核对密钥/限流规则,本地部署需验证服务状态与硬件资源; 兜底方案:重启程序、更新版本或更换服务端点,结合日志精准定位。修复后不影响OpenClaw数据完整性

奶爸的编程之路,也就一周冷个三天 2058

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

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

weiwangweiwang的博客 310

YOLO26改进策略【卷积层】| CVPR 2025 频率动态卷积 FDConv 频域分权重提多样性 + 双调制降冗余,增强特征表征能力

本文记录的是利用FDConv 算子改进 YOLOv11 的卷积层特征提取层。(Frequency Dynamic Convolution)通过傅里叶域权重划分与空间-频率双调制机制结合,实现YOLOv11特征提取中频率多样化的动态卷积与空间自适应的频带调制。本文利用算子,通过傅里叶不相交权重生成频率差异化的并行卷积核以丰富特征表达,再通过核空间调制和频带调制结合局部-全局信息、适配图像空间异构性,同时依托固定参数预算实现轻量化设计,对YOLOv11中目标的低频语义特征与高频细节/边界特征进行针对性增强、抑制

Limiiiing的博客 476

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

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

leonliu06的博客 5070

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OpenJDK源码调试

NetBeans调试HotSpot源码

BlackAngle 729

visio安装包

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

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

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

gitblog_00649的博客 453

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

手把手编译可调试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、付费专栏及课程。

余额充值