目录
更新,对JVM陆陆续续,念念不忘。
前言:
JVM,java虚拟机,想要在开发的时候有更深入的思考,对于内存的分布有更深刻的理解,jvm是继java基础内容后,必须要了解的一部分知识。可以先从基本的概念,基础的概念模型开始理解,帮助更加形象地了解JVM的结构,之后可以从反编译字节码的角度,通过类加载机制,执行引擎,把结构和运行过程联系起来。另外多分享交流呀,帮助自己整理思路,同时思想上的碰撞,可以让你更清晰地认识它。
一、描述:
作为程序媛,我们写的都是.java的文件,在开始执行程序的时候,它会被编译成.class文件。如果你使用的是idea开发工具,可以在target文件里看到你编译程序后生成的class文件。
这个也就是二进制字节码文件。从启动程序开始,在我们的项目开始执行main方法之前,这是一个很重要的操作:类加载机制。
二、什么是类加载机制?
它会把java文件加载为class文件,把class文件中的二进制流加载到内存中,做好执行代码前的准备工作,让一切程序运行需要的内存大小,code 到他们该去的地方。
放入内存的这个过程,绝对不是随便的,它有它要遵守的规则,和顺序。
三、过程:加载---链接--初始化
链接包括:验证---准备---解析
1、加载:
总要把java高级语言编程机器可以进行操作的二进制字节流,
2、链接:
确保这个二进制流逝可以是使用的的前提下,根据二进制码,虚拟机开始进行安排工作。根据cpu运行和执行的基本单位线程为依据,分为:线程共有区和线程私有区。
除了动态加载,动态创建,动态调用的数据和资源外,把当前二进制流中的接口,类,方法,参数信息分配到对应的线程区。有值的赋值,有默认值的赋默认值。
思考什么放在线程共有区,什么放在私有区?
线程共用:比如可以直接调用的静态变量,赋值后就不会再改变的常量,引用型数据类型:对象和数组,可以通过引用“指针”,在符合基本访问规则的情况下,可以被其他对象使用的数据类型,都是属于线程共有的。
还有一部分内存,占比也很大不可忽略:常量池(这里说的是运行时的)存放加载入内存的code码。
线程私有: 每一个线程中有很多的方法,方法中的局部变量的作用于当前方法是每一个线程私有的;cpu的资源是很珍贵的,可以压榨一定会压榨,所以有了多线程并行,cpu有自己的算法来选择执行哪个线程,所以有一个记录当前线程执行位置的计数器-------程序计数器。用来记录当前线程正在运行的指令地址,方便下一次获取cpu资源的时候可以根据程序计数器记录的地址继续执行这个线程。所以程序计数器是线程私有的。这里说的只是线程私有和共有区的一部分内容。
3、初始化:
调用类构造器,同时也可以给静态变量赋值,类加载机制的最后一个阶段。
这一部分先絮叨到这里啦~之后继续更新 ❀ ❀ ❀