JVM入门看着一篇就够了

1.为什么会有JVM?

JVM是为了提供一整套完全模拟硬件计算机并进行内存管理(创建和垃圾回收)的标准规范。它是一种规定好的标准规范,定义了字节码文件在内部运行的相关标准和规范

2.JVM到底是什么?

JVM,Java Vitual Machine,中文就是Java虚拟机。和名字一样就是个虚拟机器,来模拟通用的计算机,有着一套虚拟的完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM是基于栈结构的运行方式。不符合这种要求的,不是JVM,比如Dalvik虚拟机就不能称作JAVA虚拟机,因为Dalvik是基于寄存器。至于ART虚拟机是基于栈帧

3.JVM的结构是啥样的?

JVM的结构分为三部分:
类装载子系统、运行时数据区、执行引擎。如下图
在这里插入图片描述
三者之间的联系如下图:
在这里插入图片描述

(1)类装载子系统

what:
将字节码文件加载并生成在堆区的Class对象。
(1)将描述类的字节码文件加载进到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
(2)类的加载是指将类的.class文件中的二进制数据读入到内存中,然后将其放在运行时数据区的方法区,然后在堆区创建一个Class对象,用来封装类在方法区内的数据结构。类的加载最终产品是位于堆区中的Class对象。Class对象封装类在方法区内的数据结构,并向工程师提供访问方法区的数据结构的接口。

(2)运行时数据区

虚拟机栈、堆区、方法区、本地方法栈区、程序计数器。
在这里插入图片描述

JDK8.0之后的内存区域在这里插入图片描述
8.0之前的内存模型:

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

(a)栈区

1.保存的数据类型:
基本数据对象+对象应用
2.特点:
(1)存取速度快。
(2)数据大小和生存期确定,缺乏灵活性。

(b)堆区

1.保存的数据类型:
对象
2.特点:
(1)动态分配内存大小。
(2)存取速度慢。
3.堆区的划分:
(1)堆区分为:年青代(1/3)和老年代(2/3)
(2)年青代又分为Eden区(8/10)和Survivor区:
Survivor区分为From区(1/10)和To区(1/10)
4.堆区存放对象:
(1)老年代存放:
(a)大对象
(b)From区和To区复制超过15次
©From区已满时添加的对象
(5)GC的分类
(1)monor gc :Eden区放满。年青代回收
(2)full gc:老年代放满。年青代+老年代回收
(6)算法:
(a)年青区使用复制算法:更高效
(b)老年区使用标记清除算法:
©垃圾回收使用的是可达性算法
三种算法的比较。

( c)方法区

1.保存的数据类型:
class字节码文件+static变量+常量+常量池
2.特点:
(1)动态分配内存大小。
(2)存取速度慢。

(d)本地方法区

在本地方法栈中执行非java语言编写的代码,例如C/C++

(e)程序计数器

1.what
程序计数器是一块较小的内存空间,可以看成当前线程所执行的字节码的行号指示器
2.特点
(1)线程私有
多线程执行时,会分配的是CPU的时间片,当一个线程失去时间片时,需要记录所执行的位置。
(2)JVM的规则中唯一一个没有规定OOM的区域!
记录的是字节码文件的行号,因为在执行前已经知晓范围,所以,不存在OOM
(3)如果正在执行的是Native方法,这个计数器的值为空!
Native方法并没有编译成执行的字节码文件,所以,就不存在字节码文件的行号

(3)执行引擎

1.JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
2.字节码的执行是由JVM执行引擎来完成
在这里插入图片描述

4.相关知识

(1)直接内存

(1)what:
JDK1.4引入的直接操作Native内存的NIO(IO方式),避免了Java的堆内存与Native堆内存的数据复制。
(2)how
堆内存的DirectByteBuffer进行操刀。
(3)下面是TensorflowLite输入结果时,所做的预处理

private ByteBuffer transformAppSerialNum(List<BaseAppInfo> lastUsedAppList) {
    ByteBuffer arrayData = ByteBuffer.allocateDirect(100*4);

arrayData.order(ByteOrder.nativeOrder());
    for (int i = 0; i < 100; i++) {
        BaseAppInfo baseAppInfo = lastUsedAppList.get(i);

Integer integer = mAppSerialNumMap.get(baseAppInfo.getPackageName());
        if(integer != null){
            arrayData.putInt(integer);

}else{
            arrayData.putInt(0);

}
    }

return arrayData;
}

(2)线程&内存

在这里插入图片描述

(1)ThreadLocal是什么?扮演了什么角色?
ThreadLocal是一个线程局部变量的类,它所保存的对象是该线程私有。比如Looper就是使用的这种方式。扮演的是将堆的对象变成线程私有访问。
(2)StackOverFlowError?
栈溢出,每个栈区默认在JVM设置为1M,当栈帧进入的数目大于1M时,就会报这个异常。

(3)内存区域&内存模型(JMM)区别在这里插入图片描述

(1)what
内存模型是共享内存(堆区和方法区)的并发模型,线程之间主要是通过读-写共享变量(堆内存的实例,静态域以及数组)实现线程间的隐式通信。
JMM控制java线程间的通信,决定一个线程对共享变量的写入何时对其它线程可见。

(2)JVM主内存与工作内存。

5.巨人肩膀

1.https://blog.csdn.net/jiangyang100/article/details/90614280
2.https://www.cnblogs.com/natian-ws/p/10731270.html
3.https://www.cnblogs.com/haimishasha/p/11229379.html
4.https://www.cnblogs.com/ding-dang/p/13086092.html

5.内存区域与内存模型(精华)
https://www.cnblogs.com/czwbig/p/11127124.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值