jvm学习笔记

jvm学习笔记

一、JVM运行时的数据区

JVM虚拟机在运行时主要分为两块区域“线程共享区”与“线程独占区”

  • 线程共享区
    • 方法区
    • java堆
  • 线程独占区
    • 虚拟机栈
    • 本地方法栈
    • 程序计数器

下面来张图直观看一看

下面就来说说这两块区域里面具体有什么东西

首先说一说线程独占区

1、程序计数器

什么是程序计数器呢

先来看看这段代码
public class ProCount{
    public int count(){
        int a = 100;
        int b = 200;
        return a + b;
    }
}

再来看看反编译的结果 

图中使用红框框起来的就是字节码指令的偏移地址,当执行到方法count()时在当前线程会创建相应的程序计数器,在计数器中存放执行地址0 2 3 ...等等

这就是程序计数器,它的作用就是当前线程所执行的字节码的行号指示器。并且具有以下特点

1、如果线程正在执行的是java方法,则这个计数器记录的是正在执行的虚拟机字节码指令地址。
2、如果正在执行的是Native方法,则这个计数器值为空(Undefined)
3、此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域

2、java虚拟机栈

说到java虚拟机栈,按照我自己的理解来说,它就是一个栈结构的容器,那么既然是一个窗口那么里面都装的是什么呢?
那就是栈帧

栈帧就是虚拟机栈操作的基本单元也就是入栈和出栈的一个单元。

栈帧里面都有什么东西呢?

  • 局部变量表
  • 操作数栈
  • 动态链接
  • 方法返回地址

再来一张图看看

线程共享

jvm方法区

当JVM使用类装载某个类时,它首先要定位对应的class文件,最后,JVM提取该文件的内容信息,并将这些信息存储在方法区,最后返回一个class实例。那么方法区是什么?里面存了什么内容?

方法区是系统分配的一个内存逻辑区域,是用来存储类型信息的(类型信息可理解为类的描述信息)。方法区主要有以下几个特点:
一、方法区是线程安全的。由于所有的线程都共享方法区,所以,方法区里的数据访问必须被设计成线程安全的。例如,同时有两个线程都企图访问方法区中的同一个类,而这个类还没有被装入JVM,那么只能允许一个线程去装载它,而其他线程必须等待。
二、方法区的大小不是固定的,JVM可根据应用需要动态调整。同时,方法区也不一定是连续的,方法区可以在一个堆(甚至是JVM自己的堆)中自由分配。
三、方法区也可被垃圾以收集,当某个类不再被使用时,JVM将卸载这个类,进行垃圾收集。

里面都有什么内容

方法区里存的都是类型信息,也就是类的信息,而类的信息又包括以下内容:
类的全限定名
类的直接超类的全限定名(如果这个类是Obejct则没有超类)
这个类是类还是接口
类的访问修饰符,例如public、abstract、final等
所有的直接接口全限定名的有序表
常量池
JVM为每个已加载的类型都维护一个常量池。常量池就是这个类型引用到的常量的常量的一个有序集合,包括实际地的常量(stirng,integer,floating point常量)和对域和方法的符号引用。池中的数据项像数组项一样,是通过索引访问的。

java堆

堆主要就是存放对象实例,又由于是垃圾收集器管理的主要区域所以分为新生代、老年代、Eden

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值