jvm内存结构与java内存模型

前几天在面试网易的时候被问到java内存结构与内存模型,傻傻分不清,其实JVM内存结构是与JVM的内部存储结构相关,而java内存模型是与多线程有关。

JVM构成:

Java源代码编译成Java Class文件后通过类加载器ClassLoader加载到JVM中,其中

1、类存放在方法区中

2、类创建的对象存放在堆中

3、堆中对象的调用方法时会使用到虚拟机栈,本地方法栈,程序计数器

4、方法执行时每行代码由解释器逐行执行

5、热点代码由JIT编译器即时编译

6、垃圾回收机制回收堆中资源

7、和操作系统打交道需要调用本地方法接口


1、什么是Java内存模型(JMM)
        通俗来说,JMM是一套多线程读写共享数据时,对数据的可见性,有序性和原子性的规则。
JVM实现不同会造成“翻译”的效果不同,不同CPU平台的机器指令有千差万别,无法保证同一份代码并发下的效果一致。所以需要一套统一的规范来约束JVM的翻译过程,保证并发效果一致性。

2、JVM内存结构

由程序计数器,虚拟机栈,本地方法栈,堆,方法区构成。

程序计数器

  • 程序计数器是线程私有的,每个线程单独持有一个程序计数器
  • 程序计数器不会内存溢出
  • 通过移位寄存器实现

虚拟机栈

  • 栈:线程运行需要的内存空间

  • 栈帧:每一个方法运行需要的内存(包括参数,局部变量,返回地址等信息)

  • 每个线程只有一 个活动栈帧(栈顶的栈帧),对应着正在执行的代码

本地方法栈

  • 本地方法栈为虚拟机使用到的 Native 方法服务
  • Native 方法是 Java 通过 JNI 直接调用本地 C/C++ 库,可以认为是 Native 方法相当于 C/C++ 暴露给 Java 的一个接口
  • 如notify,hashcode,wait等都是native方法

  • 通过new关键字创建的对象都会使用堆内存

  • 堆是线程共享的

  • 堆中有垃圾回收机制

  • 堆内存溢出(OutOfMemoryError)

  • 堆内存诊断

  • 命令行方式

  • jconsole

  • jvisualvm

方法区

        方法区只是一种概念上的规范,具体的实现各种虚拟机和不同版本不相同

  • HotSpot1.6 使用永久代作为方法区的实现
  • HotSpot1.8使用本地内存的元空间作为方法区的实现(但StringTable还是放在堆中)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值