JVM | OpenJDK 源码执行 HelloWorld

本贴最后更新于 1555 天前,其中的信息可能已经斗转星移

开头说两句

Java 基础 Demo 站: https://www.javastudy.cloud
Java 中高级开发博客: https://www.lixiang.red
Java 学习公众号: java 技术大本营
java_subscribe

java 中用命令行执行 HelloWorld

平时我们在运行 java 程序时, 一般有两种选择, 1 是在服务器上直接用 java -jar 命令来运行程序, 2 是在 idea 中直接点击运行/debug,如下图所示:

3aqZs7

那如果某一天,我们脱离了 idea, 要用命令行来运行这个呢?

其实 idea 已经帮我们生成了,如下图第一行所示

sqHGaR

我们从上截取出如下内容,然后复制到命令行中,就可以运行了

/Users/lixiang/soft/jdk-11.0.2.jdk/Contents/Home/bin/java   -Dfile.encoding=UTF-8  -classpath /Users/lixiang/code/tools/tools-java/out/production/classes com.platform.tools.jvm.Main

运行如下图所示:

Rkahtl

Clion 中运行 java 代码

在 Clion 中运行 java 代码,主要是前面的 java 命令,用我们自己编译的, 然后后面的参数等直接复制就可以了,如下图所示:

KIPT0T

然后点击运行,就可以在 ClionDebug 面板中, 看到如下所示我们的 java 代码输出

N9XiO7

JVM 执行 Java 代码

这里我们要接着昨天的版本号输出继续往后讲,在 java.c 文件 508 行,可以看到加载 main 函数所在的类

ufp2XF

点进去之后,可以看到. 实际上还是请求的 java 里面的类,如下图所示:

e0v5rF

1,去找到这个类点进去之后可以看到是这个类 sun/launcher/LauncherHelper

2,去找到上面那个类中的 checkAndLoadMain 这个方法

3,这个方法有 Z(布尔值),I(整数类型),String 类型的入参

4,这个方法的返回值是 Class 类型

根据这个条件,我们可以在 Idea 中找到如下方法

asvm4F

然后我们一路跟踪下去, 可以看到,最终到了 ClassLoader.java 中的 defineClass1 这个 native 方法,native 方法和 jdk 源码的对应我们后面再一起学习.

UEvlV2

LoadMainClass() 方法之后, 我们可以看到 CreateApplicationArgs 创建应用的参数方法,去寻找 Main 方法,执行 Main 方法,如下所示:

j4bIlm

总结

这部分的主要的知识点是怎么在 Clion 中执行 java 程序, 这样才能为后面的调试打下基础,小伙伴们,加油!

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...