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

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

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

    84230

    一次 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 等待数据写入,但永远不会有数据写入即可。

    88220

    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

    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。

    84920

    深入理解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.8K51

    java类加载器通俗理解

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

    64020

    System类、Runtime类、Robot类

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

    60920
    领券