从Java文件到程序运行起来的场景分析

整体流程

  • 1.我们写完代码,是以一个xxx.java的文件存储代码的,这就是Java的源代码文件
  • 2.2.有了源代码文件还不够,这是面向程序开发者的语言,而不是面向JVM的语言,所以还有一个编译的过程,将xxx.Java → xxx.class,这个class文件就是所谓的字节码文件,是可以供JVM来识别运行的。
  • 3.有了class文件,还需要将文件加载到JVM中,这里就使用到了classloader来将class加载到JVM中。
  • 4.好了,现在class文件加载进来了,但是还不能直接让JVM执行,因为JVM有一套规范,如果不遵守这套规范,JVM是不会运行文件的,所以这里有一个阶段叫做验证,就是用来做这个事情的。
  • 5.解析完毕,就可以实际开始操作了,这时候将class文件中所提到的各种field给分配内存,并提供初始值,例如0。所以这里有一个阶段,准备就是来做这个事情的
  • 6.既然已经准备好了,但是这时候这些值其实并不知道对方的存在,也不知如何去访问对方,这时候就需要将这些值得引用转化为直接内存地址,以便于访问,所以这里有这么一个过程,解析,就是来做这么一个事情的。
  • 7.然后解析也已经完毕了,这时候就进行初始化了,将class文件中,程序开发人员所定制的值进行赋值。
  • 8.到这时候,整个大的准备过程才算完,可以开始使用字节码引擎进行执行了。
  • 9.接下来就涉及到代码执行了。

Jvm 内存区域分析

在Java里面,代码是以线程为单位来执行的,所以,先来看看那代码到线程里都需要些什么?首先得有一个地方存方法以便于用来执行,这个地方就是Java方法栈,这里又要说了,Java线程里执行可不止一个方法,那么在方法帧要有更细丽都的执行单位,这就是栈帧。还有一点,就是你多线程之间的切换,cpu不执行当前线程去执行别的线程里,总得有个地方保存,当前线程执行位置吧,之后cpu切换回来之后,以便于恢复上下文,所以这里还有个线程独有的区域,程序计数器。

讲到这里,整个Java从写代码到运行起来的大致思路都有了。我们也可以从整个流程很容易推断出Java的内存区域,接下来就将它们推出来,方便记忆: 1.之前说到过class需要被加载到内存里吧,所以,有一个地方是专门用来存储class等类相关文件,这就是方法区,也可以说永久代。 2.然后你class得创建对象吧,所以这里有个存放对象的区域,堆内存。 3.有了对象,得执行方法吧,所以执行方法得有一个区域,Java虚拟栈 4.Java以线程为单位执行,所以遇到多线程总有线程上下文切换吧,所以这里有个保存执行状态的程序计数器。 5.其他,Java支持Jni,可以与其他例如C/C++等native语言交互,所以有个本地方法区等本地相关的内存区域。

具体如图:
运行流程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值