jvm是java 运行坏境 jre的一部分
作用:将class 文件 转成字节码
特点:一次编译多出运行
主要有5个区域 :
1:java栈 2:本地方法区 3:程序计数器(线程私有 )
生命周期:随着方法的开始开始,随着方法的结束而 结束。跟线程有关系
4:堆区 5: 方法区 (线程共有 )
堆区的生命周期:
方法区 的生命周期:不能回收: 例如final或者static 修饰的
==========讲解5个区域
1:java栈 也叫虚拟机栈
java栈:
主要存储的是栈帧(就是方法) methedA()
栈帧里存储的是
1:局部变量 例如 : int x=0 int y=1 存放在局部变量表
2;操作 数栈 :例如 int z=x+y
3:动态链接‘: 被调用的方法无法在编译期确定,只能在运行时确定 例如: 接口回调,多态动态绑定
4:返回地址:方法正常退出
===========================
2:本地方法区
存储线程运行 Native方法的数据指令返回地址 结构和java栈一样 区别就是 Native方法 是c或者c++的
===========================
3:程序计数器
当前线程正在执行的字节码的指令地址和行号,确保jvm多线程运行
================
4:堆 存储new 出来的对象
================
5:方法区:
1:存放字节码
2:存储类信息 例如:常量(final 修饰的) 静态变量(static 修饰 )
3. 字符串相关的常量池
======================
jvm 内存模型
==============
Gc 回收机制
1:做垃圾回收的时候 把不可回收的对象copy到预留区域
然后把存放对象 区域做格式化 :例如:电脑 值 c盘和d盘 我要 清理c盘,我先把我需要的文件 copy到d盘 然后再把c盘格式化
2:内存碎片: 理解保存的对象 内存地址不连续 ,
例如:内存地址是1格到4格,1存了一个对象 3存了一个对象,在来 一个对象需要2个格子 存储,那2格子就浪费了
90% 的对象 朝生夕死只有10% 的需要 回收
在交换区 使用复制算法 10% 做预留
交换区:是 堆内存中的新生代中的 s0 s1
1:新生代 :复制回收算法
2:老年代::标记清楚 和标记整理
===============标记清楚
============标记整理 算法
由于标记清除算法 有内存碎片,所以和标记整理算法配合非常好,因为标记整理 会在标记清除之后把不可分配的对象 进行物理移动 ,谁设置成连续的内存地址。
一般不回开启标记整理 因为消耗 性能除非 内存碎片计较多
测试: