※ Jdk的目录结构

bin: 存放java的执行命令,详情参考java-command.txt文件,该目录应当保存到PATH变量中
Lib:是JDK工具用到的类库及其他文件,eg:tools.jar就包含了对开发工具的支持功能库
jre: java的运行环境(包含了java的类库和JVM虚拟机)
src.zip:jdk提供的类库的java代码
db:jdk自带的小型数据库
Include:包含c语言编写的文件

※ java的特点:

加速开发
写一次,到处运行
支持程序多线程的出来
动态的支持升级及编译
没有指针,不需要管理内存,纯粹的面相对象编程
提供gc的支持

垃圾回收器(GC)
垃圾回收器:java中有一个线程,专门负责JVM中垃圾内存的释放
垃圾:没有引用的内存节点
垃圾回收的算法
注意:垃圾回收有自己的算法,我们是不能控制垃圾回收机制的,虽然有和垃圾回收相关的方法:java.lang.System.gc() java.lang.Runtime.gc(),但是还是无法控制垃圾回收机制算法有(知道算法名字即可,不需要下去研究具体实现):标记-清除,复制,标记-整理,分代收集

※ Java程序执行的整个流程


Hello.java- -编译 ->Hello.class- ClassLoader装载- ->JVM- ->字节码验证

  • ->对字节码逐行解析- ->执行
  • ->JIT(即时编译) - ->执行

JVM装载.class 文件到内存的过程剖析(双亲委托机制)

启动级类加载器(Bootstrp ClassLoader)用C++语言写的,它是在Java虚拟机启动后初始化,它主要负责加载%JAVA_HOME%/jre/lib,
-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类

扩展级类加载器(Extension ClassLoader)用java语言写的,它负责将%JAVA_HOME%/jre/lib/ext或者由系统变量 java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

本地类加载器(Applicaiton ClassLoader)用java语言写的,用于加载我们自己定义编写的类,它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,因此一般称为系统
(System)加载器

当源文件(.java文件)被编译成.class文件,且经过合法检测后,.class的运行过程如下:
依图中FirstStatic.class文件为例:
1)FirstStatic.class文件首先进入方法区。方法区用于首先处理.class文件。将.class文件中的静态的东西放入静态区属于类,只有一个),将非静态方法放入非静态区。
2)当主方法main中生成对象时,我们首先在堆里开辟一块区域用来放对象FirstStatic(),然后对非静态属性赋值。(静态属性早在静态区就赋过初值了)
3)方法的调用实际就是压栈的过程,调用静态方法时,将静态方法压入栈内,调用非静态方法时,将非静态方法压入栈内。(区别在与静态方法是在.class文件进入后就生成了,只有一个,调用时需考虑线程;非静态方法调用时,在生成对象之后,是在非静态方法中有一个方法镜像,不同对象调用时,通过镜像压入栈内不是同一个方法。)

※ 注:
先后顺序为:
1)静态的东西最先进入(直接存在了静态区)。
2)匿名代码块。
3)构造器(隐式默认无参构造器)生成对象赋值。
4)只有new时会在堆区开辟一块地方,所以只要有new,就会生成一个地址。
5)方法的调用是压栈的过程,方法没有地址。

※ 继承下生成子类对象时:
1)父子类里静态属性,覆盖默初始值,如有显示赋值,进行赋值;
2)父类的静态代码块,子类的静态代码块;
3)父类的非静态属性,覆盖默初始值,如有显示赋值,进行赋值;
4)父类的匿名代码块;
5)父类的构造器;
6)子类的非静态属性,覆盖默初始值,如有显示赋值,进行赋值;
7)子类的匿名代码块;
8)子类的构造器。

※ 双亲委托机制加载类的过程

当本地类加载器加载一个class时,它首先不会自己去尝试加载这个类,
而是把类加载请求委派给父类加载器扩展级类加载器去完成。

当扩展级类加载器加载一个class时,它首先也不会自己去
尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。

如果扩展级类加载器加载失败,会使用扩展级类加载器来尝试加载;
若扩展级类加载器也加载失败,则会使用本地类加载器来加载,
如果本地类加载器也加载失败,则会报出异常ClassNotFoundException。

※ 生成jar包和解压jar包

-c 创建新的归档文件
-v 在标准输出中生成详细输出
-f 指定归档文件名
-x 解压归档文件
打包
jar -cvf Hello.jar Hello.class
解包
jar -xvf Hello.jar

※ 字节码验证过程

代码要符合JVM的规范
代码破不能破坏计算机的系统或者硬件
栈不能溢出
方法的参数类型要正确
类型转换要正确

※ JIT(即时编译)

通过代码的运行,基于2080规则基于算法
找出里面重复率比较高的代码存储起来,下次调用的时候不需要
在编译,直接执行。

class文件运行过程相关推荐

  1. linux java运行class文件_jvm学习java文件运行过程

    汇编 汇编的目的是把汇编语言转为机器语言. 链接 链接是要解决目标文件之间的互相依赖关系,当a文件中的aa方法中调用了b文件的bb方法时,在汇编完成后,a文件的bb方法并没有准确的内存地址,链接后会转 ...

  2. JSP文件的运行过程

    JSP文件运行过程如下: 1)当一个jsp文件第一次被访问时,jsp引擎会将其转译为Java源文件(Servlet),在转译过程中如果发现jsp有任何语法错误,转译将中断,并向客户端和服务端输出错误信 ...

  3. ServletContext中getRealPath()读取文件、观察servlet运行过程

    1.getRealPath() getServletContext()中的方法getRealPath()其作用是获取项目运行目录的路径. 该方法继承自父类HttpServlet //声明上下文对象 S ...

  4. 深入浅出Spring Security(三):FilterChainProxy的运行过程

    上篇回顾 我们已经知道了Spring Security的核心过滤器的创建和原理,本文主要介绍核心过滤器FilterChainProxy是如何在tomcat的ServletContext中生效的. Se ...

  5. java 程序运行过程 简介

    这里的Java程序运行过程,是指我们编译好代码之后,在命令行开始执行java xxx命令,到java程序开始执行起来的这一过程,我们称其为运行时. 第一步,操作系统解析我们输入的java xxx命令, ...

  6. C++ 编译,运行过程 详解。

    要更深入了解C++, 必须要知道一个程序从开始到结束都干了些什么, 怎么干的. 所以我从C++编译到运行过程,解析下程序是怎么跑的. 首先,初略的说一下之前C++的编译过程,C++编译过程包括预编译- ...

  7. python 利用pyinstaller 编译.exe文件过程中编写完的.exe文件执行过程中闪退

    问题描述: python 利用pyinstaller 编译.exe文件过程中编写完的.exe文件执行过程中闪退,并提示no module named 'pyproj.datadir' 解决方法: 闪退 ...

  8. DispatcherServlet代码分析及运行过程

    DispatcherServlet代码分析及运行过程 1    首先该类有一静态语块,用以加载缺省策略. static { ClassPathResource resource =new ClassP ...

  9. MySQL 5.7.18 zip 文件安装过程

    MySQL 5.7.18 zip 文件安装过程 安装MySQL:5.7.18(千万注意路径问题,不要直接照抄) 1.下载路径 https://dev.mysql.com/downloads/mysql ...

最新文章

  1. 可以检验计算机配置的游戏软件,检测游戏配置的软件-有没有自己检验电脑配置是否符合游戏要求配置 – 手机爱问...
  2. LeetCode——Rotate Image(二维数组顺时针旋转90度)
  3. arcgis怎么运行python_在arcgis上用python脚本(arcpy)做数据批处理
  4. 用户 'NT AUTHORITY/NETWORK SERVICE' 登录失败 的解决方法(转)
  5. .net core 注入机制与Autofac
  6. 解决WordPress无法上传媒体文件以及无法下载和安装主题与插件的问题
  7. java 代码转换_java字符编码转换过程(转)
  8. CAngle类 角度转换类 C++
  9. ES6学习笔记二(解构赋值、语法糖)
  10. 迪艾姆python培训视频
  11. 软件测试肖sir__008项目管理工具之禅道
  12. 联想电脑摄像头无法使用
  13. Matlab linspace函数C++实现
  14. 20200227——Spring 框架的设计理念与设计模式分析
  15. 《元宇宙十大技术》感谢乔卫兵等6位为出版做出巨大贡献
  16. Chatty登录测试
  17. 《超越对手-大项目售前售后的30种实战技巧》读书心得
  18. cannot find -lxxx解决方法
  19. ATECC508A芯片开发笔记(十一):NXP 平台移植ATECCx08 CryptoAuthLib库(I2C)
  20. 【慧河网络安全组】Web基础题解培训

热门文章

  1. Vue移动端插件Vant使用
  2. C++基础编程题(06)求调和平均数(两个数,的倒数平均值的倒数)
  3. matlab怎么做函数,Matlab定义函数怎么操作?进行定义函数教程分享
  4. Angular学习之组件和@Component
  5. Java面试宝典!java语言程序设计教程魏永红
  6. 开源堡垒机Guacamole二次开发记录之二
  7. Spring源码深度解析,Spring源码以及Bean的生命周期(五)(附代码示例:)
  8. [华为动态路由-RIP协议] RIP协议的介绍和配置
  9. iperf网络带宽测试
  10. [浪子学编程][读书笔记]-道法自然之需求分析