JVM的秘密

JVM的秘密

(博客是本人csdn原创博客)
JVM的位置

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200702112323324.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ==,size_16,color_FFFFFF,t_70)
可以看出JVM是运行在操作系统上的,它与硬件没有直接的交互
假如你买的新电脑上有Java环境,那么说明这个系统已经被别人用过了!

JVM体系结构图

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200702170356838.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ,size_16,color_FFFFFF,t_70)
栈区不会有垃圾;
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200702170824617.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ
,size_16,color_FFFFFF,t_70)

JVM调优99%的情况下都是在调堆,

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200702171650477.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ==,size_16,color_FFFFFF,t_70)

类加载器ClassLoader

一个类加载加载到JVM的基本结构
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200702173319428.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ==,size_16,color_FFFFFF,t_70)
在如下的几种情况下,Java虚拟机将会结束生命周期;
1:执行了System.exit()方法
2:程序正常执行结束
3:程序在执行过程中出现了异常或者错误导致程序终止
4:由于操作系统出现问题导致Java虚拟机进行终止

类的加载,连接和初始化

在Java代码中,Class类的加载,连接和初始化过程都是在程序运行期间完成的。Runtime!

  • 加载:查找并加载类的二进制数据
  • 连接
    *验证:确保被加载类的正确性
    *准备:为类的静态变量分配内存,并将其初始化为默认值
    *解析:把类中的符号引用转换为直接引用
在编译的时候每一个Java类都将会被编译成一个class文件,但在编译的时候虚拟机并不知道所引用类的地址,所以就用符号来代替,而在这个解析阶段就是为了把这个符号应用转换成为真正的地址的阶段
                                                        

初始化
为类的静态变量赋予正确的初始值
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200703182850518.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ,size_16,color_FFFFFF,t_70)
Code
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200703183939524.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ
,size_16,color_FFFFFF,t_70)
类的加载
类的加载是指将类的class文件中二进制数据读入到内存中,将其放在运行时数据区内的方法区内,然后在内存创建一个Java.lang.class对象用来封装类在方法区的数据结构。
![在这里插入图片描述]( https://img-blog.csdnimg.cn/2020070320460555.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ,size_16,color_FFFFFF,t_70)
Result
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200703204643903.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ
,size_16,color_FFFFFF,t_70)
常量池的概念
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200703205944235.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ,size_16,color_FFFFFF,t_70)
类的初始化规则
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200703210755297.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXpoaTU1NTU1NWppZQ
,size_16,color_FFFFFF,t_70)

Class Loader分类

有两种类型的类加载器

  • 根类加载器(BootStrap)(BootClassLoader) sun.boot.class.path(加载系统的包,包括JDK核心库里的类)

  • 扩展类加载器(Extesion)(ExtClassLoader) java.ext.drive(加载扩展jar包中的类)

  • 系统(应用)类加载器(System)(AppClassLoader) java.class.path(加载你编写的类,编译后的类)

2:用户自定义的类加载器

posted @ 2021-01-06 16:02  xiaozhounandu  阅读(143)  评论(0)    收藏  举报