首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

没想到进入main函数前,发生了这么多事!

来看传给它的第一个参数,这是新线程启动后将要执行的入口函数:JavaMain。...JavaMain 这个函数的名字就有点意思了,看起来,快要进入Java的地界儿了,加油继续看下去: int JNICALL JavaMain(void * _args) { // ......// 寻找启动 mainClass = LoadMainClass(env, mode, what); // ... // 寻找启动中的main函数 mainID...中的细节挺多的,咱们抽出需要关心的,要调用咱们写的main方法就像把大象关进冰箱一共三步: 找到启动 找到启动中的main方法 调用它 具体寻找的过程这里就不展开了,有些繁琐,但你应该能猜到,Java...代码编译后都是以class文件的形式存储的,所以这个寻找的背后少不了要涉及到class加载等一系列的工作。

80330

openjdk使用_深入地理解

目录 前言 一、从JVM源码看加载器 1.1 Java层面的加载器 1.2 JVM是如何启动的 1.3 C++层面的加载器 1.3.1 初始化BootStrapClassLoader 1.3.2...BootStrapClassLoader如何加载 二、总结 ---- 前言   关于JVM加载的基础理论知识,请参照《深入理解Java虚拟机》读书笔记(六)–虚拟机加载机制(上)和《深入理解Java...一、从JVM源码看加载器   注:使用的是openjdk8 1.1 Java层面的加载器   我们都知道在Java加载中,除了BootStrap加载器,App和Ext加载器都是Java实现的..., threadStackSize, (void*)&args); ...... } }   记住这里ContinueInNewThread0函数传的第一个参数是JavaMain。...我们只需要关心线程调用的函数:JavaMain

80020

一次 JVM 进程退出分析

(String[] args) { System.out.println("in main"); } } 接下来我们来调试源码看看,JVM 运行以后会进入 java.c 的 JavaMain...方法, int JNICALL JavaMain(void * _args) { // ... /* Initialize the virtual machine */ InitializeJVM...CallStaticVoidMethod(env, mainClass, mainID, mainArgs); // main 方法结束以后接下来调用下面的代码 LEAVE(); } JavaMain...方法内部就是做了 JVM 的初始化,然后使用 JNI 调用了入口的 public static void main(String[] args) 方法,如果 main 方法退出,则会调用后面的 LEAVE...小结 为了保证程序常驻运行,Java 中可以使用 CountDownLatch 等并发的,等待不可能发生的条件。在 Go 中可以使用一个 channel 等待数据写入,但永远不会有数据写入即可。

83220

Java程序main方法执行流程

ret : rslt; } //真正调用Java的main函数入口 int JavaMain(void* _args) { JNIEnv *env = 0; jclass mainClass...这个结构体InvocationFunctions会一直当做参数传递到JavaMain函数中。...之后再JavaMain函数中,会根据JNI_CreateJavaVM虚拟机创建函数来初始化虚拟机,此时已经是在一个新的线程中运行了。...VMThread用于执行VMOptions 初始化主要JDK,如String、System,Class、线程/线程组、Module,还有其他反射、异常相关的 初始化jni方法的快速调用 标记虚拟机的基本初始化完成...第二阶段,初始化模块化系统 第三阶段,初始化安全管理器、设置系统加载器作为线程上下文的加载器 启动监听线程WatcherThread,用来模拟时钟中断。

1.2K30

深入理解Java之jvm启动流程

后续Arguments会对JavaVMOption数据进行再次处理,并验证参数的合理性。...线程栈大小确定后,通过ContinueInNewThread方法创建新线程,并执行JavaMain函数,JavaMain函数的大概流程如下: 1、新建JVM实例 InitializeJVM方法调用InvocationFunctions...2、加载主的class Java运行方式有两种:jar方式和class方式。 jar方式: ?...1、调用GetMainClassName方法找到META-INF/MANIFEST.MF文件指定的Main-Class的主名; 2、调用LoadClass方法加载主的class文件; class...1、调用NewPlatformString方法创建名的String对象; 2、调用LoadClass方法加载主的class文件; 3,查找main方法 通过GetStaticMethodID方法查找指定方法名的静态方法

6.3K51

java加载器通俗理解

由Java编写的加载器都继承自java.lang.ClassLoader。 各种类加载器之间存在着逻辑上的父子关系 ?...主要是加载main函数所在的,启动扩展加载器、应用加载器也是在这个时候完成的 int JNICALL JavaMain(void * _args) { ......sun.launcher.LauncherHelper,执行该类的方法checkAndLoadMain,最终完成加载main函数所在的 双亲委派 双亲委派:如果一个加载器收到了加载某个的请求,则该类加载器并不会去加载该类...,而是把这个请求委派给父加载器,每一个层次的加载器都是如此,因此所有的加载请求最终都会传送到顶端的启动加载器;只有当父加载器在其搜索范围内无法找到所需的,并将该结果反馈给子类加载器,子类加载器会尝试去自己加载...jdbc接口的实现,然后进行管理,但是DriverManager由启动加载器加载,而其实现是由服务商提供的,由应用加载器加载,这个时候就需要启动加载器来委托子类来加载实现,从而破坏了双亲委派。

61120

System、Runtime、Robot

System: System主要是用来操作、获得系统相关的一些东西,例如之前用到的获取系统时间的方法System.currentTimeMillis(); ? 运行结果: ?...所以这时候就要使用到BigDecimal。 BigDecimal: BigDecimal用于解决float和double运算时会丢失精度的问题。...BigInteger:   BigInteger是一个能够存储很大的整型数字的,能够存储很多很多的数字,并且不会损失精度。 ? 运行结果: ?...Runtime: Runtime是用来使应用程序能够与其运行的环境相连接的,使用对象可以访问JVM的相关信息,如处理器数量,内存信息等。并且可以控制终端执行一些系统命令。...Robot: Robot是可以实现自动控制的一个,例如自动控制鼠标,键盘,截图等功能。 控制键盘: ? 控制截图: ? 控制鼠标: ?

58720

java_Object、日期时间、System、包装

Object java.lang.Object 是所有的父。它描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父就是Object。...如果一个没有特别指定父, 那么默认则继承自Object。...例如: public class MyClass /*extends Object*/ { // ... } 根据JDK源代码及Object的API文档,Object当中包含的方法有11个。...DateFormat java.text.DateFormat 是日期/时间格式化子类的抽象,我们通过这个可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换...装箱与拆箱 基本类型与对应的包装对象之间,来回转换的过程称为”装箱“与”拆箱“: 装箱:从基本类型转换为对应的包装对象。 拆箱:从包装对象转换为对应的基本类型。

1.2K20

java日期(二)TimeZone,Calender

目录 TimeZone(时区) TimeZone对象 getDefault() 获取本地的时区对象 getAvailableIDs() 获取全世界的时区id getAvailableIDs(int...rawOffset) 根据偏移量获取时区id getTimeZone(String ID) getDisplayName() getID() 获取到当前的时区id Calender 概念 calender...对象里面有什么 从源码里面学习这个Calender setTime() get() add(int field, int amount) TimeZone(时区) 每一个地区都有时区id ,就是国际上面认定的时区...ZONE_OFFSET=28800000, DST_OFFSET=0 ] 根据上面的返回值,我们可以知道,返回的东西为当前时间全部的日期对象 可以直接根据字段摘要获取东西 从源码里面学习这个Calender...setTime() 我们前端传过来的时间是字符串类型,我们要对这个时间进行操作,那么就可以转为Calender 这个对象,进行操作,因为这个里面的方法是很多的,可以对时间进行各种各样的操作。

1.5K30
领券