这里的Java程序运行过程,是指我们编译好代码之后,在命令行开始执行java xxx命令,到java程序开始执行起来的这一过程,我们称其为运行时。

第一步,操作系统解析我们输入的java xxx命令,根据PATH中所配置的jrd路径找的其bin目录下的java.exe程序(这个程序是用c语言写的,源码在jdk的src文件中的laucher目录下),然后再初始化一些java参数(比如classpath、虚拟机参数等)。

第二步,java.exe程序根据上一步读入的虚拟机参数,分配内存并启动jre/bin目录下client目录或者server目录(哪个目录取决于第一步中的虚拟机参数)下的jvm.dll,java虚拟机开始启动。

第三步,java虚拟机初始化内存,产生bootstrap classloader,这个类加载器负责加载java API(jvm+java API被称为java运行时),其实这些jar包主要分布在jre/lib下,这些我们可以通过在java命令后加-verbose:class(如下图),可见第一个被载入的java类是Object类。

[java] view plaincopy
  1. C:\Documents and Settings\nomouse>java -verbose:class
  2. [Loaded java.lang.Object from shared objects file]
  3. [Loaded java.io.Serializable from shared objects file]
  4. [Loaded java.lang.Comparable from shared objects file]
  5. [Loaded java.lang.CharSequence from shared objects file]
  6. [Loaded java.lang.String from shared objects file]
  7. [Loaded java.lang.reflect.GenericDeclaration from shared objects file]
  8. [Loaded java.lang.reflect.Type from shared objects file]
  9. [Loaded java.lang.reflect.AnnotatedElement from shared objects file]
  10. [Loaded java.lang.Class from shared objects file]
  11. [Loaded java.lang.Cloneable from shared objects file]
  12. [Loaded java.lang.ClassLoader from shared objects file]
  13. [Loaded java.lang.System from shared objects file]
  14. [Loaded java.lang.Throwable from shared objects file]
  15. [Loaded java.lang.Error from shared objects file]
  16. [Loaded java.lang.ThreadDeath from shared objects file]
  17. [Loaded java.lang.Exception from shared objects file]
  18. [Loaded java.lang.RuntimeException from shared objects file]
  19. [Loaded java.security.ProtectionDomain from shared objects file]
  20. [Loaded java.security.AccessControlContext from shared objects file]
  21. ...

第四步,bootstrap classloader载入完java API后,还会负责载入ExtClassLoader并生成一个实例,它继承于ClassLoader类,负责载入jre/lib/ext下的jar包(所以有时候需要把servlet.jar包加进去,相当于一个不配置在classpath中就可以默认访问的公共jar目录),到这里,java虚拟机默认加载类工作完成!

第五步:java虚拟机找到我们指定的Class,加载这个类(所谓自定义类加载,是指我们自己写的java类、以及我们引入的一些第三方jar包的加载方式,只有代码中运行到类的时候才回去加载,我们可以实现自己的ClassLoader类,用来加载我们自己的类,如果我们没有实现自己的类加载器,上面说的ExtClassLoader会默认载入AppClassLoader并生成一个实例,由这个类加载器来进行加载),然后找到这个类的main方法,启动程序。

java 程序运行过程 简介相关推荐

  1. Java程序运行机制简介

    Java程序运行机制 Java语言是一种特殊的高级语言,它既具有解释型语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤. 高级语言的运行机制 计算机高级语言按程序的执行 ...

  2. java程序运行过程数据丢失怎么办_java运行过程中OutOfMemoryError是什么原因?怎么解决...

    1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件 ...

  3. 【Java开发语言 01】第一章 Java语言概述(基础常识+Java语言概述+Java程序运行机制及运行过程+Java语言环境的搭建+开发体验hello world+错误:编码GBK的不可映射字符)

    java入门-第一章Java语言概述 1基础常识 软件开发 人机交互方式 常用的DOS命令(win系统,有一些直接通过命令执行的) 2 Java语言概述 什么是计算机语言 关于面向对象和面向过程 Ja ...

  4. Java程序运行机制及其运行过程

    java两种核心机制:java虚拟机跟垃圾回收机制.本文主要讲的是jvm运行java程序. (一)终端中如何运行一个java程序(这个是我在mac下运行的,windows下原理是一样的,大同小异) 做 ...

  5. java程序运行5步骤_浅析Java程序的执行过程

    一 .jdk内容概述 当安装好jdk后(本示例jdk版本为11.0.1,不同版本,目录有细微差别,但bin目录包含的exe是一样的),打开bin目录,有两个重要的exe文件:javac.exe(编译器 ...

  6. JDK下载、安装、运行第一个Java程序的过程以及javac不是内部或外部命令的解决办法

    JDK下载.安装.运行第一个Java程序的过程以及javac不是内部或外部命令的解决办法 1.下载和安装JDK开发环境 下载地址:https://www.oracle.com/technetwork/ ...

  7. java在程序运行过程中_Java内存管理-程序运行过程(一)

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 勿在浮沙筑高台,出来混迟早要还的. 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine( ...

  8. JAVA程序运行流程

    Java程序运行 1.使用javac将后缀.java的源文件编译成.class字节码文件 2.JVM加载字节码(也称为类加载) 从表面上看,.class文件通过加载,生成某种形式的Class数据结构进 ...

  9. BetaFlight飞控启动运行过程简介

    BetaFlight飞控启动&运行过程简介 1. 源由 2. 启动过程 2.1 main(主程序) 2.2 init (初始化) 2.3 run 3. 任务调度 3.1 任务定义 3.2 sc ...

最新文章

  1. sql_trace的介绍
  2. logicaldoc 6.5 结合postgresql 9.x安装部署—基于windows平台
  3. An Edge-Guided Image Interpolation Algorithm via Directional Filtering and Data Fusion【翻译】
  4. Android安全开发之安全使用HTTPS
  5. CF1096E The Top Scorer
  6. 前端学习(3224):字符串形式
  7. usb连接不上 艾德克斯电源_STM32F7 电源控制器(PWR)
  8. 致敬F1七冠王!Redmi K50电竞版邀请函曝光 打造掌上梦幻跑车
  9. 【源码好又多】开源在线教育系统
  10. 按键精灵打怪学习-窗口绑定技能
  11. elementui 遮罩
  12. android instance区别,Android singleTask 和singleInstance的区别
  13. java可以进行爬虫吗_java能写爬虫程序吗
  14. 基于51单片机WiFi温湿度远程控制
  15. 鼠标左键双击计算机打开属性,鼠标左键双击变成属性怎么解决?
  16. Snapchat三类广告形式及收益提升技巧详解
  17. ios标准时间转为北京时间
  18. [DownUnderCTF 2022] crypto部分复现
  19. 如何在VMware Workstation上安装Nutanix CE的解决方案
  20. 快速web开发框架——learun framework

热门文章

  1. 机会与挑战:2019人工智能应用趋势预测
  2. 央视深入报道,国内主流芯片真实水平如何?
  3. 谷歌云TPU服务正式全面开放:「AlphaGo背后的芯片」进入商用化
  4. 2017年全球AI芯片公司大盘点
  5. [Server] 服务器配置SSH登录邮件通知
  6. 阿里云前端周刊 - 第 39 期
  7. linux磁盘满处理
  8. 分享 10 道 Nodejs 进程相关面试题
  9. 单元测试案例(白盒测试)
  10. 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合