环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的jvm信息

简介: 环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的jvm信息

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

关于环境

这里写图片描述

  • 这个InitLauncher函数有何作用?展开后发现里面调用了JLI_SetTraceLauncher函数,而JLI_SetTraceLauncher函数的源码如下:

这里写图片描述

  • 很简单,如果环境变量"_JAVA_LAUNCHER_DEBUG"的值不等于0,就将_launcher_debug的值设置为1。
  • _launcher_debug有什么用呢?我们看看/usr/local/openjdk/jdk/src/share/bin/jli_util.c文件中的JLI_TraceLauncher方法:

这里写图片描述

  • 原来如此,只要_launcher_debug等于1,JLI_TraceLauncher方法在执行的时候就不会提前返回,而是把入参的信息做格式化再打印出来,在openjdk目录下全局搜索JLI_TraceLauncher函数,发现调用的地方还真不少呢,如下图,9个文件里都有调用:

这里写图片描述

  • 在容器中执行vi /etc/profile命令,在内容的最底部新增两行脚本:
_JAVA_LAUNCHER_DEBUG=1
export _JAVA_LAUNCHER_DEBUG
  • 如下图:

这里写图片描述

  • 在执行以下命令使配置生效:
source /etc/profile
  • 现在回到目录/usr/local/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin,执行./java -version,会发现输出的内容比以前丰富了很多,如下图,红框内是修改/etc/profile之前的输出,其他的全是新增的内容,这些新增的内容都是通过JLI_TraceLauncher输出的,以前由于没有环境变量_JAVA_LAUNCHER_DEBUG导致不输出,现在可以全部看到了:

这里写图片描述

  • 虽然已通过设置环境变量_JAVA_LAUNCHER_DEBUG看到了更多的信息,但似乎意犹未尽,不如我们改一点openjdk源码,亲自调用一下JLI_TraceLauncher函数试试。
  • 首先我们修改/usr/local/openjdk/jdk/src/share/bin/java.c,在JavaMain函数中,找到下面这一行:

这里写图片描述

  • 在上面红框位置的下面增加一行代码JLI_TraceLauncher("static main method execute success (from boling_cavalry)");
  • 这样代码的意思是在class类的main函数执行完毕后,输出一段文本信息"static main method execute success (from boling_cavalry)"
  • 修改后如下图:

这里写图片描述

  • 现在回到/usr/local/openjdk目录下,执行以下两个命令开始编译openjdk源码:
./configure --with-debug-level=slowdebug
make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=OK CONF=linux-x86_64-normal-server-slowdebug
  • jdk构建成功后,我们新建一个类Hello.java,在此位置新建:/usr/local/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin,这个类很简单:
public class Hello{
        public static void main(String[] args){
                System.out.println("hello world!");
        }
}
  • 在这个目录下执行./javac Hello.java生成Hello.class文件,再执行./java Hello,得到的输出如下:

这里写图片描述

  • 红框中就是class中的输出以及我们修改openjdk源码添加的输出,达到我们的预期目的了,现在自定义的日志再加上上一章的GDB断点,可以帮助我们可以更好的阅读和实践openjdk源码,探索神秘的JVM。

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关文章
|
7天前
|
Oracle Java 关系型数据库
java体系结构和jvm
java体系结构和jvm
|
21天前
|
Java
有关Java发送邮件信息(支持附件、html文件模板发送)
有关Java发送邮件信息(支持附件、html文件模板发送)
23 1
|
1月前
|
监控 Java
Java如何获取堆栈信息
【2月更文挑战第19天】
|
1月前
|
Java 编译器 测试技术
滚雪球学Java(03):你知道JDK、JRE和JVM的不同吗?看这里就够了!
【2月更文挑战第12天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
103 4
|
2月前
|
算法 Java 关系型数据库
掌握这3个技巧,你也可以秒懂JAVA性能调优和jvm垃圾回收
JVM 是一个虚拟化的操作系统,类似于 Linux 和 Window,只是他被架构在了操作系统上进行接收 class 文件并把 class 翻译成系统识别的机器码进行执行,即 JVM 为我们屏蔽了不同操作系统在底层硬件和操作指令的不同。
21 0
|
2月前
|
存储 缓存 算法
深入剖析Java中JVM的内存模型!!!
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
46 1
|
1月前
|
存储 Java 数据安全/隐私保护
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
34 0
|
2月前
|
存储 算法 Java
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
52 1
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
|
18天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
57 0
|
2月前
|
Java 流计算
这个错误信息来自于Java的ScheduledThreadPoolExecutor类,具体的原因是RejectedExecutionException,也就是任务被拒绝执行
【2月更文挑战第3天】这个错误信息来自于Java的ScheduledThreadPoolExecutor类,具体的原因是RejectedExecutionException,也就是任务被拒绝执行
32 2