返回顶部
首页 > 资讯 > 前端开发 > node.js >在Java语言中main方法是如何被执行的
  • 108
分享到

在Java语言中main方法是如何被执行的

2024-04-02 19:04:59 108人浏览 泡泡鱼
摘要

这篇文章主要讲解了“在Java语言中main方法是如何被执行的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Java语言中main方法是如何被执行的”吧!

这篇文章主要讲解了“在Java语言中main方法是如何被执行的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Java语言中main方法是如何被执行的”吧!

对于Java而言,其底层是Java虚拟机在跑着,也就是JVM,这篇文章如无特殊说明,默认以Hotspot为研究对象。

先来回顾一下那篇文章,对于C/C++程序而言,从创建进程到进入main函数,主要就是经历了四个阶段:

  • 进程 & 主线程创建阶段

  • 主线程启动执行并进行进程级初始化操作(如加载系统动态链接库)

  • 主线程进入可执行文件的入口(OEP)并进行C/c++运行时库初始化

  • 从C/C++运行时库调入main函数

你知道的,Java的虚拟机JVM主要是C++编写的,所以JVM本质上也算是一个C++程序。

因此,上面的四个阶段,对于JVM而言,同样适用。

只不过呢,对于C/C++程序而言,到这里就已经进入main函数了,话题就可以结束了,而对于Java程序,执行到JVM的main,一切才刚刚开始。

JVM的main

故事,要从JVM的main函数开始讲起···

你应该知道的,不管你是普通Java程序,还是用的spring或者其他什么框架,最终的程序都是在一个Java进程中运行的,这个进程的可执行文件就是一个exe(windows上)或者elf(linux上)。

咱们就从这个可执行文件入手,以Linux系统上的Java8版本为例,用反汇编神器IDA打开可以看到,这个可执行文件的入口:

在Java语言中main方法是如何被执行的

和咱们在上一篇分析的流程符合,进入这个程序启动入口后,会经过一系列的调用,最后来到main函数:

在Java语言中main方法是如何被执行的

反汇编看着好头大,好在,HotSpot虚拟机有开源版本,咱们可以去Openjdk中找来这个main函数的源码瞧瞧。

不同版本差异还是挺大,这里以Java8为例:

代码路径:https://GitHub.com/openjdk/jdk/blob/jdk8-b20/jdk/src/share/bin/main.c

在Java语言中main方法是如何被执行的

在这个代码中除了main函数,还可以看到如果定义了JAVAW宏定义,则入口从main变成了WinMain函数,做过Windows应用程序开发的朋友这个时候应该露出了满意的微笑。

如果定义了JAVAW,则是一个Win32 GUI的程序,当然在Linux上是肯定没有这个宏定义的,不过这不是本文的主题。

可以看到main函数只是一个包装,直接就进入了JLI_Launch中。

这个函数位于同目录下的隔壁java.c文件中,是JVM非常重要的初始化函数,主要完成了下面几件事情:

  • 参数解析,环境配置

  • 检查Java运行环境

  • 加载JVM核心动态库libjvm.so

  • 创建并初始化Java虚拟机对象

这些过程都不是我们这篇文章探究的目标,咱们继续把目光聚焦在Java中的main函数是怎么得到调用的。

在JLI_Launch的结尾,调用了ContinueInNewThread,从这个函数的名字我们也能窥探它的作用。

在Java语言中main方法是如何被执行的

这个函数还是一层封装,内部调用了真正干活的函数ContinueInNewThread0:

在Java语言中main方法是如何被执行的

接下来就是创建线程来继续后面的事情了,不过创建线程涉及到操作系统api的调用,所以这个函数在不同版本的系统中都有对应的实现。来看传给它的第一个参数,这是新线程启动后将要执行的入口函数:JavaMain。

JavaMain

这个函数的名字就有点意思了,看起来,快要进入Java的地界儿了,加油继续看下去:

int JNICALL  JavaMain(void * _args) {       // ...     // 寻找启动类     mainClass = LoadMainClass(env, mode, what);     // ...     // 寻找启动类中的main函数     mainID = (*env)->GetStaticMethodID(env, mainClass, "main",                                        "([Ljava/lang/String;)V");     // ...     // 调用它     (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);     // ... }

JavaMain中的细节挺多的,咱们抽出需要关心的,要调用咱们写的main方法就像把大象关进冰箱一共三步:

  • 找到启动类

  • 找到启动类中的main方法

  • 调用它

具体寻找的过程这里就不展开了,有些繁琐,但你应该能猜到,Java代码编译后都是以class文件的形式存储的,所以这个寻找的背后少不了要涉及到class类加载等一系列的工作。

总之,一顿操作猛如虎,嘿,JVM把咱们写的main方法找到了!接下来就是调用它了。

进入Java世界

调用main方法的是CallStaticVoidMethod,从名字可以看到,这是在调用一个静态的、返回值为空的方法。注意了,C++的地盘快到边境了,咱们即将通过它来到美丽的Java新世界!

这个函数内部后面会来到:

JavaCalls::call(result, method, &java_args, CHECK);

最终,会创建Java方法栈帧,准备好模板解释器,随后转向解释器入口开始执行字节码,正式进入Java世界!

进入Java世界第一站,就是前面找到的启动类的main方法,在这里开启程序在Java世界的征程。

感谢各位的阅读,以上就是“在Java语言中main方法是如何被执行的”的内容了,经过本文的学习后,相信大家对在Java语言中main方法是如何被执行的这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 在Java语言中main方法是如何被执行的

本文链接: https://lsjlt.com/news/83355.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 在Java语言中main方法是如何被执行的
    这篇文章主要讲解了“在Java语言中main方法是如何被执行的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Java语言中main方法是如何被执行的”吧!...
    99+
    2024-04-02
  • Android Studio无法执行Java main方法的问题
    Android Studio升级到哦最新版3.6.1后,新建了个项目,发现无法执行Java类的main方法,很蛋疼。试了网上的各种方法,比如切换...
    99+
    2022-06-06
    Android Studio main studio JAVA Android
  • Java Main如何在maven中运行
    本篇文章为大家展示了Java Main如何在maven中运行,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、从命令行运行运行前先编译代码,exec:java不会自动编译代码,你需要手动执行mvn ...
    99+
    2023-05-31
    java main maven
  • Java 中main方法如何使用
    这篇文章给大家介绍Java 中main方法如何使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。让我们先从最简单的"单线程"来入手:(1)带引号说明只是相对而言的单线程,(2)基于java。clas...
    99+
    2023-06-17
  • Android Studio无法执行Java类的main方法问题及解决方法
    Android Studio升级到哦最新版3.6.1后,新建了个项目,发现无法执行Java类的main方法。试了网上的各种方法,比如切换gradle离线模式、gradle.pr...
    99+
    2022-06-06
    Android Studio main studio JAVA Android
  • MySQL SQL语句是如果被执行的?(1)
    语法解析和预处理(Parser & Preprocessor) 假如我们随便执行一个字符串,MySQL服务器会报一个1064的错误: 1064 - You have an error in your SQL syntax; check th...
    99+
    2019-07-25
    MySQL SQL语句是如果被执行的?(1)
  • java jdbc执行sql语句的方法是什么
    在Java中使用JDBC执行SQL语句的方法主要有以下几种:1. 使用Statement对象执行SQL语句:```javaState...
    99+
    2023-09-27
    java jdbc sql
  • c语言中main函数的用法是什么
    在C语言中,main函数是程序的入口点,是程序执行时的起始函数。主函数main是程序中的一个特殊函数,程序在运行时首先调用main函...
    99+
    2024-04-02
  • 一条SQL语句在MySQL中是如何执行的
    今天就跟大家聊聊有关一条SQL语句在MySQL中是如何执行的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言最近开始在学习mysql相关知识,自己...
    99+
    2024-04-02
  • 在Java语言中什么是构造方法
    这篇文章给大家分享的是有关在Java语言中什么是构造方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是构造方法带参数的构造方法1.3.1 什么是构造方法在Java语言中,当创建一个对象时,需要对创建的对象做...
    99+
    2023-06-03
  • GO语言在Linux下同步执行Shell脚本的方法是什么?
    在Linux系统中,Shell脚本是一种非常常见的脚本语言,可以用于快速地执行一些常见操作,比如创建文件、删除文件、修改文件权限等等。而GO语言是一种非常流行的编程语言,它可以用于开发各种类型的应用程序,包括服务器应用、桌面应用、移动应用...
    99+
    2023-10-25
    同步 shell linux
  • java的main方法中如何调用spring的service方式
    小编给大家分享一下java的main方法中如何调用spring的service方式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!main方法调用spring的se...
    99+
    2023-06-21
  • 如何执行Go语言的命令
    标题:如何执行Go语言的命令,需要具体代码示例 Go语言是一种强大的编程语言,广泛用于后端开发、系统编程等领域。在Go语言中,我们经常需要执行一些命令行操作,比如运行外部程序、调用系统...
    99+
    2024-04-02
  • Java MyBatis是如何执行一条SQL语句的
    目录背景阅读环境阅读过程加载XML的过程创建Mapper获得一个Mapper执行一个Mapper的方法结论背景 在前两天的一次面试中,面试官问了一个和标题一样的问题,由于一直认为My...
    99+
    2024-04-02
  • java中找不到main方法如何解决
    在Java中,必须包含一个main方法作为程序的入口点。如果找不到main方法,可能是以下几个原因:1. 没有正确命名或拼写main...
    99+
    2023-10-09
    java
  • java执行maven的方法是什么
    要执行Maven命令,需要使用以下方法: 使用Maven的命令行工具执行命令。在命令行中输入mvn后,可以跟随各种Maven命令...
    99+
    2023-10-23
    java maven
  • java方法调用在内存中的执行过程是什么
    这篇“java方法调用在内存中的执行过程是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java方法调用在内存中的执行过...
    99+
    2023-07-02
  • 如何运行GO语言的可执行文件
    要运行GO语言的可执行文件,你需要按照以下步骤进行操作:1. 编译源代码:使用GO编译器将GO源代码编译成可执行文件。在命令行中,使...
    99+
    2023-08-15
    GO语言
  • c语言程序执行的方法有哪些
    C语言程序的执行方法有以下几种:1. 编译执行:将C语言程序通过编译器编译成机器码,生成可执行文件,然后直接运行可执行文件。2. 解...
    99+
    2023-08-08
    c语言
  • 在Go语言中如何解决并发任务并行执行问题
    在Go语言中,可以使用goroutine和channel来解决并发任务并行执行的问题。首先,使用关键字go来创建一个goroutin...
    99+
    2023-10-09
    Go语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作