jvm的基础知识

时间:2022-12-26 22:02:10

1:jvm的内存分区,具体到每个区存放什么

Q:字节码指令和字节码解释器

Q:androd4.4前后使用的是什么虚拟机?

Q:class文件是什么?所含信息有哪些?

  • 程序计数器
    • 是概念模型,在真正的jvm中其功能可能会以更高效的方式实现
    • 字节码计时器就使用程序计数器来指向下一条“字节码指令”
    • 线程私有,每个线程均有一个
    • 唯一一个没有内存溢出Error的区域
    • 对于java方法,记录字节码指令的地址;native方法,其值为空
  • VM 栈
    •   线程私有
    • 它描述方法的内存模型:每个方法在执行的同时会创建一个“栈帧”(stack frame)用于存储局部变量表、操作数栈、方法出口动态链接等
    • 其中局部变量表存储7种基本数据类型数据和引用类型数据(reference),某种程度上来说vm的栈区就特指vm栈的局部变量表
    • double/long两种数据类型数据占用2个“局部变量空间”
    • 可能会发生栈溢出和内存溢出Error
  • 本地方法栈
    • 针对native方法
    • 在某些vm中该栈与vm栈合并
    • 对于实现方式(数据结构、语言、使用方式)没有硬性规定
    • 可能会发生栈溢出和内存溢出Error
  • 堆(Heap)
    • 用于存放对象实例,是GC的主要回收对象
    • 线程共享
    • 物理内存可以不连续,逻辑上连续即可
    • 可能会发生内存溢出Error
  • 方法区
    • 存放已经被类加载的“类信息”、“常量”、“静态变量”、“即时编译器编译后的代码”
    • 线程共享
    • GC回收在此处较少见
    • 逻辑上是heap的一部分但是又叫做“non-heap”,以示与heap的区别
    • 可能会发生内存溢出Error
  • 运行时常量池
    • 是方法区的一部分
    • “常量池”是class文件的一部分,用于存放“字面量”和“符号引用”
    • 运行时常量池相对于常量池,具有动态性的特点,在运行时也可以将新的常量放入池中