类加载器 加载 缓存 进程加载 JDK1.8 引用类型数据和基本数据类型比较

类加载器

(引导类)启动类加载器,由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储存的是值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值