JVM(上)

发布时间:2024年01月21日

目录

一、JVM概述

????????一、JVM作用

????????二、JVM整体组成部分

二、JVM结构-类加载

? ? ? ? 一、类加载子系统概述

? ? ? ? 二、类加载过程

????????1.加载

? ? ? ? 2.链接

? ? ? ? 3.初始化(类加载过程中的初始化)

????????三、类加载器分类

????????大致分两类:

? ? ? ? 细致分类:

? ? ? ? 四、双亲委派机制

????????五、打破双亲委派机制

三、JVM运行时数据区

? ? ? ? 一、运行时数据区组成概述

? ? ? ? 二、程序计数器

? ? ? ? 特点:?

? ? ? ? 三、Java虚拟机栈

? ? ? ? 1、特点:

? ? ? ? 2、栈帧构成:

? ? ? ? 四、本地方法栈

? ? ? ? 1、作用:

? ? ? ? 2、特点:

? ? ? ? 五、Java堆内存

?? ? ? ?????1、特点:

? ? ? ? ? ? 2、堆内存区域划分:

? ? ? ? ? ? 3、分区原因:

? ? ? ? ? ? 4、对象创建内存分配过程

? ? ? ? ? ??5、堆空间的参数设置

? ? ? ? ? ??6方法区


一、JVM概述

????????一、JVM作用

? ? ? ? JVM负责把字节码文件(.class)加载到虚拟机中,再把字节码文件解释/编译为机器码,管理运算时数据存储,垃圾回收。现在JVM还可以执行其他语言编译后的字节码文件。

????????二、JVM整体组成部分

? ? ? ? 1.类加载器:从硬盘上加载字节码文件到JVM中。

? ? ? ? 2.运行时数据区:按照不同的数据类型进行分区存储(方法区、堆、栈(用于放自己的方法)、本地方法栈(调用本地方法),程序计数器(用于线程切换,记录程序运行到那行))。

? ? ? ? 3.执行引擎:将字节码再次编译/解释成机器码 。

? ? ? ? 4.本地方法接口:调用本地操作系统方法接口。

其大致操作流程如下所示:

二、JVM结构-类加载

? ? ? ? 一、类加载子系统概述

????????????????从硬盘上加载字节码文件到JVM中。

? ? ? ? 二、类加载过程

????????

????????1.加载

????????以二进制字节流方式加载字节码。(通过类名/地址获取类的二进制字节流)

? ? ? ? 在内存中为类生成一个class类对象,将静态存储转为运行时存储。(从硬盘到内存,用来生成class对象方法)

? ? ? ? 2.链接

?????????1.验证:验证字节码格式是否正确,语法是否正确。? ?

? ? ? ? ?2.准备:为类的静态属性分配内存,并设初值。(但注意final static常量是在编译时设的初值)

? ? ? ? ?3.解析 :静态文件中符号(指令符号)引用替换成内存中直接引用。(符号引用是 Class 文件的逻辑符号,直接引用指向的方法区中某一个地址)

? ? ? ? 3.初始化(类加载过程中的初始化)

? ? ? ? 对类变量(静态变量进行赋值)

????????类被初始化的时间有:使用类中静态变量,静态方法,运用main方法,创建对象,使用反射加载一个类,初始化类的子类优先加载父类。

? ? ? ? 注意:当只使用类中静态常量时,类不会被初始化,因为在编译阶段就初始化了,当类在加载阶段初始化完成,才说明类的整个加载过程结果。

????????三、类加载器分类

? ? ? ? 真正实施类加载的具体实现者(事务)

????????大致分两类:

? ? ? ? 1.引导类加载器

? ? ? ? 2.其他所有类加载器

? ? ? ? 细致分类:

1 、引导类加载器(启动类加载器 BootStrap ClassLoader)

用 C/C++语言实现,嵌套在 JVM 内部。

Java中系统提供的类,都是由启动类加载器加载.例如:String。

只存放在JAVA_HOME>\lib 目录。

2 、扩展类加载器(Extension ClassLoader)

由 java 语言实现,独立存在于虚拟机外部。

由 sun.misc.Launcher$ExtClassLoader 实现.。派生于 ClassLoader 类。

jre/lib/ext子目录(扩展目录)下加载类库。

3、 应用程序类加载器(系统类加载器 Application ClassLoader)

由 java 语言实现,独立存在于虚拟机外部。

由 sun.misc.Launcher$ExtClassLoader 实现.。派生于 ClassLoader 类。

加载我们自己定义的类,用于加载用户类路径(classpath)上所有的类。

4、自定义类加载器

例如:我们自己写一个类继承ClassLoader。

例如:TomCat这种容器都会有自己加载类的加载器。

? ? ? ? 四、双亲委派机制

? ? ? ? 当加载一个类时,先让上一级的类加载器去加载;

? ? ? ? 直到找到引用类加载器;

? ? ? ? 如果上级类加载器找到了,就要上级类加载器的类;

? ? ? ? 如果上级找不到,就逐级向下委托,使用子类加载器的类;

? ? ? ? 如果找不到报异常。

? ? ? ? 优点:安全,避免自己编写的类替换 Java的核心类,如 java.lang.String.

????????五、打破双亲委派机制

? ? ? ? 通过自定义类加载器,重写ClassLoader类中的findClass();从而打破双亲委派机制。

三、JVM运行时数据区

? ? ? ? 一、运行时数据区组成概述

????????按照不同的数据类型进行分区存储,分为五部分:程序计数器,虚拟机栈,本地方法栈,堆,方法区。

? ? ? ? 二、程序计数器

? ? ? ? 用来记录程序执行指令地址。

? ? ? ? 特点:?

? ? ? ? 内存小,速度快 ;

? ? ? ? 线程私有(每个线程都有自己的程序计数器);

? ? ? ? 生命周期同线程一致;

? ? ? ? 不会出现内存溢出(JVM中唯一区域);

? ? ? ? 不会有垃圾回收。

? ? ? ? 三、Java虚拟机栈

? ? ? ? 管理(Java自己写的)方法运行,调用方法入栈,运行完成出栈。

????????栈是运行时单位,一个方法入栈后可以看作一个栈帧,一个栈帧表示一个方法。

? ? ? ? 1、特点:

????????栈是线程私有的,内存可能溢出,不会有垃圾回收,快速存储访问方式(仅慢于程序计数器)。

? ? ? ? 2、栈帧构成:

? ? ? ? 局部变量表:存储方法中定义的变量,参数;

? ? ? ? 操作数栈:所有计算都借助操作数栈完成;

? ? ? ? 方法返回地址:记录被调用方法位置(从哪里来,回哪里去);

? ? ? ? 还有动态链接和一些附加信息。

? ? ? ? 四、本地方法栈
? ? ? ? 1、作用:

????????用于管理本地方法的调用。

? ? ? ? 本地方法就是系统库提供方法,用native关键字修饰。例如:

? ? ? ?hashCode();getClass();clone();notify();notifyAll();? ? wait();? ? read0();

start0();

? ? ? ?2、特点:

????????线程私有,可能栈溢出,不会垃圾回收。

????????JVM调优:调内存大小,选择垃圾回收器。

? ? ? ? 五、Java堆内存

? ? ? ? 存储程序中产生对象。

?? ? ? ?????1、特点:

? ? ? ? 线程共享,可能内存溢出,会垃圾回收(垃圾回收的重点区域是堆),是JVM 管理中最大区域,堆内存大小可调节。

? ?????????2、堆内存区域划分:

?????????Eden:刚创建的对象存储区。

? ? ? ? Survivor:存放Eden和另一个幸存者区经垃圾回收后存活下来的对象,两个幸存者区交替使用,都比较小。

? ? ? ? OldGen:存储生命周期长的,非常大的,经过15次回收还存活的对象。

? ? ? ? 3、分区原因:

? ? ? ? 可根据不同存活时间进行划分,生命周期较长的对象,放在老年区,减少垃圾回收频率和扫描次数。

? ? ? ? 4、对象创建内存分配过程

1.新创建的对象放在Eden区,但Eden区大小有限;

2.当垃圾回收时,将Eden区存活的对象移入Survivor0中;

3.继续运行,再创建对象还是保存在Eden区。

4.下一次垃圾回收时,将Eden区存活的对象与Survivor0区中存活对象放入Survivor1中,反复交替执行;

5.当一个对象经历过15次垃圾回收次数后 仍存活,那么就将此对象移入OldGen,在对象头中4个bit位用来记录回收次数,可设置回收次数,最大值为15。

老年代:新生代 = 2:1,Eden:Survivor0:Survivor1 = 8:1:1

5、堆空间的参数设置?

JVM调优是根据程序实际运行的需要设置的参数,调整各个区间比例大小。

垃圾回收名词:

? ? ? ? Minor GC:针对新生代进行垃圾回收(频繁回收YoungGen)

? ? ? ? Major GC:针对老年代进行垃圾回收(频繁回收OldGen)

? ? ? ? Full GC:整堆收集 实际开发中尽量避免整堆收集。(老年代不足或方法区空间不足 时触发整堆收集)

6、方法区

? ? ? ? 主要用于存储加载到虚拟机的类信息 。

? ? ? ? 特点:

????????方法区大小可调节,线程共享,会垃圾回收。

? ? ? ? 方法区垃圾回收条件苛刻,要同时满足三个条件:

? ? ? ? 1、该类的所有对象和子类对象都不存在。

? ? ? ? 2、加载该类的加载器不存在了。

? ? ? ? 3、该类的Class对象不被其他地方引用。

因此认为一般情况下类是不会被卸载的。

文章来源:https://blog.csdn.net/m0_61976036/article/details/135615588
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。