深入理解Java虚拟机(JVM)

1. JVM运行时数据区域

在这里插入图片描述

1.1 Program Counter (PC)

程序计数器, 存放指令位置, 虚拟机的运行,类似于这样的循环

while(not end){
     取PC中的位置,找到对应位置的指令;
     执行该指令;
    PC++;
}

1.2 Native Method Stacks

本地方法栈,java调用C/C++写的方法(JNI)
一般不去管他,也没办法优化

1.3 JVM Stacks

每个线程对应一个栈,每个方法对应一个栈针
jvm stacks里装的各种栈针

1.3.1 Frame - 栈帧(每个方法对应一个栈帧)

栈针包括以下四部分内容:

  1. Local Variable Table:局部变量表
  2. Operand Stack:操作数栈
  3. Dynamic Linking (jvms2.6.3):Constant Pool的指针
  4. return address:方法a调用了方法b,b方法的返回值放在什么地方,叫做return address

1.4 Direct Memory(直接内存)

  1. java1.4以后增加,不归JVM虚拟机管,归操作系统管,用户空间可以直接访问内存空间。JVM可以直接访问内核空间的内存。
  2. NIO , 提高效率,实现zero copy。

1.5 Method Area(方法区)

存储虚拟机加载的class信息(类的版本、字段、方法、接口),常量,静态常量,即时编译后的代码等

  1. Perm Space(<1.8)
    字符串常亮位于PermSpace
    FGC不会回收
    大小启动的时候指定,不能变

  2. Mate Space(>=1.8)
    字符串常亮位于堆
    会触发FGC清理
    不设定的话,最大就是物理内存

可以理解为 Perm Space 或 Mate Space 是Method Area不同版本的实现。

1.5 Heap(堆)

java虚拟机最大的内存区域,存放对象实例,也是垃圾收集器管理的主要区域,分为新生代(由Eden加两个Survivor组成)和老生代,再JDK1.8中,young 和 old 比例1:2
可能会抛出OutOfMemoryError异常。

1.6 常用指令集

  1. 基于寄存器的指令集
  2. 基于栈的指令集
    Hotspot中的Local Variable Table(局部变量表) = JVM中的寄存器

2. 常用指令

  • store
    弹出操作数栈栈顶元素,保存到局部变量表
  • load
    变量压入操作数栈
  • InvokeStatic
    调用类的static方法
  • InvokeVirtual
    调用对象实例的方法
  • InvokeInterface
    将属性定义为接口来进行调用
  • InovkeSpecial
    调用private 方法 , 构造方法
    可以直接定位,不需要多态的方法
  • InvokeDynamic
    lambda表达式或者反射或者其他动态语言(scala kotlin),动态产生的class,会用到的指令
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值