类加载器
(引导类)启动类加载器,由c++实现,没有父类
拓展类加载器(ExtClassloader),由java语言实现,父类加载器为null
系统类加载器(AppClassLoader),由Java语言实现,父类加载器为ExtClassLoader
自定义类加载器,父类加载器为AppClassLoader
自下向上检查类是否装载,自上而下尝试加载类
类加载过程
.java文件中储存着需要执行的程序逻辑.java文件在java编译器上编译出拓展名为.class的字节码文件,.class文件中保存这Java代码转换后的虚拟机指令,当程序启动加载类时,会先将class文件字节码内容加载到内存当中,并将这些静态数据转换成方法 区的运行时的数据结构,然后在堆中生成一个代表这个类的java.lang.class对象,作为方法区中类数据的访问入口
(加载Loading->[验证Verification->准备->Preparation->解析Resolution]->初始化lnitialization)
idea里jvm参数-xx:+........ -xx代表jvm虚拟机 +代表追踪 -代表不追踪, 在-xx前面可以加-Xmx...最大堆内存 -Xms....最小堆内存这两个参数
program arguments这一栏里填写的是jvm的调优参数args
system GC 启动GC\回收内存
GC回收堆内存中的数据
full回收方法区,元数据区数据, 堆内存
类缓存
标准的javaSE类加载器可以按照要求查找类,,但类被加载到类加载器中,将会持续加载(缓存)一段时间.JVM的垃圾回收机制可以回收这些class对象
程序的加载
程序的加载是通过执行exec(3)系统调用的实现的,当命令行上执行一个程序,或在图形界面系统中双击通过这个系统来执行程序,执行这个系统调用后,陷入操作系统内核,有操作系统负责加载该程序文件,若ELF文件是动态链接可执行文件(程序头中存在PT_INTERP)需要动态链接器的支持,操作系统则将该动态连接器映射进内存,并准备好相应的环境,将控制权转移给动态连接器,若EILF文件是静态链接的,则操作系统准备好环境后直接转移到ELF文件的入口点开始执行
进程的加载
虚拟内存实在磁盘空间开辟空间作为内存的一个补充,进程可以一部分驻留在内存上,而其它部分储存在虚拟内存上.
优点操作系统同时执行的进程数量会大幅提升
操作系统可以执行比内存空间大的多的进程
页表 操作系统会为每个进程维护一个页表 ,记录下每个块的页号,不要求连续可避免外部碎片,但会产生极小的内部碎片(可执行程序每个块不足4k的不足4k,也就是不足的也占4k),4k是系统维护页表的页号等,还有就是连续储存的方式,会形成外部碎片,进程与进程之间会有空隙,总空隙加起来够进程空间,但是由于是分散的碎片,所以不能用.
程序的缓存
缓存是指可以进行高速数据交换的储存器,它先于内存与cpu交换数据,因此速率很快.L1Cache(一级缓存)是cpu第一层高速缓存.缓存是当cpu读取一个数据时,cpu首先从缓存中查找,找到就立即读取并送给cpu处理,没有找到就从速率相对较低的内存中读取并送给cpu处理,同时把这个数据所在的数据块调到缓存当中,之后在这区域内读缓存,不用再读取内存.
功能 预读取 写入 历史存储
Java本地缓存的实现
1. 根据HashMap自定义实现本地缓存 缓存的本质就是存储在内存中的KV数据结构,对应的就是jdk中的HashMap,但是要实现缓存,还需要考虑并发安全性、容量限制等策略,下面简单介绍一种利用LinkedHashMap实现缓存的方式: LinkedHashMap维持了一个链表结构,用来存储节点的插入顺序或者访问顺序(二选一),并且内部封装了一些业务逻辑,只需要覆盖removeEldestEntry方法,便可以实现缓存的LRU淘汰策略。 此外我们利用读写锁,保障缓存的并发安全性。 需要注意的是,这个示例并不支持过期时间淘汰的策略。 自实现缓存的方式,优点是实现简单,不需要引入第三方包,比较适合一些简单的业务场景。
.class文件
.class文件是字节码文件内容是以一组8位字节为基础单位的二进制流,各个数据项严格按顺序排列,没有任何分隔符,其格式采用一种类似于语言结构体的伪结构来储存数据,这种结构只有两种数据类型:无符号数和表
不同操作系统虚拟机读取.class文件,进行对.class文件进行解译后在不同的操作系统上运行程序,就是说.class文件可以通过虚拟机跨越不同操作系统上正常执行,可以被不同系统认可,从而解译执行,不会出现乱码之类的运行不匹配的问题等.
Java程序,先由编辑器编译出.class文件.class文件被jvm虚拟机读取,解译出底层系统能够识别运行的二进制文件,之后二进制文件被底层识别执行.
序列化文件
序列化是指将Java文件中对象转换成字节流,从而储存对象的信息,将对象传输
JS对象转化成json串就是序列化
Java程序的运行机制
Java经过Java编译机译出.class文件.class文件经过jvm虚拟机解译出对应操作系统的能够读取编译的二进制文件,系统读取二进制文件运行程序.
JDK1.8
jdk1.8以后接口升级了 可以有默认实现方法(方法前加default ) 不只有抽象方法
引用类型和基本数据类型数据比较(==)
ingter q 为引用数据类型 ==比较比较数值和地址(类似于对象) q储存的是引用类型对象的地址值
在常量池范围内 定义的变量 是直接从常量池中取(没有的话创建之后储存在常量池里共二次使用)
所以地址值是一样的,超出范围的是自己创建的地址值,地址值唯一所以不同.(编译是为包装类,运行时为基本类型,运行时会自动拆箱)
int q为基本数据类型 ==比较比较数值 基本数据类型的常量池(-128到127) q储存的是值