02_jvm

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:老年代::标记清楚 和标记整理


===============标记清楚


============标记整理 算法

由于标记清除算法 有内存碎片,所以和标记整理算法配合非常好,因为标记整理 会在标记清除之后把不可分配的对象 进行物理移动 ,谁设置成连续的内存地址。

一般不回开启标记整理 因为消耗 性能除非 内存碎片计较多


测试:

你可能感兴趣的:(02_jvm)