环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的JVM信息
关于环境:###
本文中的实战都是在docker容器中进行的,容器的出处请参照《在docker上编译openjdk8》一文,里面详细的说明了如何构造镜像和启动容器。
在上一篇文章《修改,编译,GDB调试openjdk8源码(docker环境下)》中,我们分析了虚拟机启动的代码,在阅读JLI_Launch函数的时候,发现调用了InitLauncher函数,如下图红框部分:

这个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。
欢迎关注我的公众号

环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的JVM信息的更多相关文章
- 【java】JDK安装后,没有配置环境变量,也可以java -version查看到版本信息
JDK安装后,没有配置环境变量,也可以java -version查看到版本信息 原因是:jdk安装过程,java.javaw.javaws三个命令被复制到C:\windows\system32目录下 ...
- [php基础]PHP环境变量$_SERVER和系统常量详细说明
在PHP网站开发中,为了满足网站的需要,时常需要对PHP环境变量进行设置和应用,在虚拟主机环境下,有时我们更需要通过PHP环境变量操作函数来对PHP环境变量值进行设置.为此我们有必要对PHP环境变量先 ...
- ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable
Netweaver 更准确的说应该是系统变量:结构体sy 设一个断点,调试器里看这些字段的值就能知道每个字段是用来做什么的. sy-dbsys sy-sysid sy-opsys sy-saprl s ...
- Linux命令行--使用linux环境变量(转)
5.1 什么时环境变量 bash shell用一个成为环境变量的特性来存储有关的shell回话和工作环境的信息,这是它们成为环境变量的原因.它允许你在内存中存储数据,以便运行在账户.系统.shell的 ...
- 【Windows】JDK安装与环境变量配置
一.JDK下载 jdk有多个版本: java se开发包:Java SE Development Kit 8u25 ,必须的配置Java开发环境的.java se开发包+示例:Java SE Deve ...
- centos 为OPENJDK配置JAVA_HOME环境变量,安装MAVEN
1.安装开发者工具包 yum install java--openjdk-devel -y 2.配置环境变量 vim /etc/profile export JAVA_HOME=/usr/lib/jv ...
- Windows系统环境变量、JAVA环境变量配置以及JVM加载过程
一:用户变量和系统变量的区别 右击我的电脑.属性.高级系统设置.环境变量. 对话框的上面为Administrator的用户变量,对话框的下面为系统变量.我们所说的环境变量一般指系统环境变量,对所有用户 ...
- 全新 Mac 安装指南(编程篇)(环境变量、Shell 终端、SSH 远程连接)
注:本文专门用于指导对计算机编程与设计(尤其是互联网产品开发与设计)感兴趣的 Mac 新用户,如何在 Mac OS X 系统上配置开发与上网环境,另有<全新 Mac 安装指南(通用篇)>作 ...
- Windows环境下maven 安装与环境变量配置
Maven是一个项目管理的Java 工具,在JavaEE中,我们可以使用Maven方便地管理团队合作的项目,现在我们在学习JavaEE框架,使用Maven可以管理类库,有效方便地供团队中的其他人员使用 ...
随机推荐
- 6.源码分析---和dubbo相比SOFARPC是如何实现负载均衡的?
官方目前建议使用的负载均衡包括以下几种: random(随机算法) localPref(本地优先算法) roundRobin(轮询算法) consistentHash(一致性hash算法) 所以我们接 ...
- 学好C/C++编程,走遍天下都不怕
C++这门语言从诞生到今天已经经历了将近30个年头.不可否认,它的学习难度都比其它语言较高.而它的学习难度,主要来自于它的复杂性.现在C++的使用范围比以前已经少了很多,java.C#.python等 ...
- 使用RedisMQ 做一次分布式改造
引言 熟悉TPL Dataflow博文的朋友可能记得这是个单体程序,使用TPL Dataflow 处理工作流任务, 在使用Docker部署的过程中, 有一个问题一直无法回避: 在单体程序部署的瞬间会有 ...
- Java高级面试题解析(二):百度Java面试题前200页(精选)
基本概念 操作系统中 heap 和 stack 的区别 heap是堆,stack是栈,是两种不同的数据结构.堆是队列优先,先进先出:栈是先进后出. 在java多线程中,每个线程都有自己的栈:不同的线程 ...
- 什么是Singleton?
Singleton:在Java中即指单例设计模式,它是软件开发中最常用的设计模式之一. 单:指唯一 例:指实例 单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式. 要点: ...
- 如何在GitHub上删除自己的项目?
话不多说,直奔主题~ 1.打开GitHub,在主页左边有自己写的库. 2.拿删除第二个库wlh-hub/vue-zsgc为例,点击它,进入下面页面. 3.在导航栏一栏中,找到settings,并点击. ...
- selenium中的setUp,tearDown与setUpClass,tearDownClass的区别
def setUpClass(cls): cls.driver = webdriver.Chrome() cls.driver.maximize_window() def setUp(self): s ...
- 调用百度翻译 API 来翻译网站信息
之前说过jquery.i18n.js 来做网站的中英翻译,前提就得做一套中文内容,一套英文内容来解决,好处是中英翻译可以准确无误,本篇文章我们来看一下调用百度翻译的 API 来进行网站的翻译,但是翻译 ...
- pyinstaller打包django项目成exe以及遇到的一些问题
1. 环境 环境为:win7 + Python3.6 + Django (2.1.10) + PyInstaller (3.5) 注意: 这里的PyInstaller,笔者是直接使用pip安装,中间会 ...
- 40 篇原创干货,带你进入 Spring Boot 殿堂!
两个月前,松哥总结过一次已经完成的 Spring Boot 教程,当时感受到了小伙伴们巨大的热情. 两个月过去了,松哥的 Spring Boot 教程又更新了不少,为了方便小伙伴们查找,这里再给大家做 ...