面试问题浓缩总结 面试问题浓缩总结
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • Go

  • JAVA

    • java基础
    • 面向对象
    • 集合框架
    • 并发框架(JUC)
    • IO NIO框架
    • JVM模型
      • JVM内存模型
        • happens-before是啥
    • 类加载机制
    • 垃圾回收
    • 参数调优
    • java8特性
    • 面试题
    • 其他
    • Java书籍学习笔记
  • C、C++语言

  • JavaScript和HTML

  • Android相关

  • 程序语言
  • JAVA
小游
2021-03-20

JVM模型

# JVM内存模型

这里主要还是会问一些Java的内存模型,1.8之前和之后的内存模型是不一样的

在这里插入图片描述 在这里插入图片描述

简单说一下每个部分是干嘛的吧

  • 程序计数器 用于记录程序执行的位置(字节码解释器可以改变这个来选取下一条执行的指令)
  • 虚拟机栈 描述的是java方法执行的内存模型,每个方法执行都会创建一个栈帧,栈帧包含局部变量表、操作数栈、动态连接、方法出口等。
  • 本地方法栈 本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一,本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现StackOverFlowError 和 OutOfMemoryError 两种错误。
  • 堆 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
  • 方法区 与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  • 元空间 jdk1.8之后,就把方法区放到元空间了,元空间直接放到本地内存了(这样我们就不用担心之前永久代内存溢出的问题,只要本地内存足够,就不会出现java.lang.OutOfMemoryError: PermGen space的错误)

还有一个更加详细的

img

参考:

  1. JVM基础知识和调优_冷雨清的博客-CSDN博客_jvm调优 (opens new window)
  2. JVM之虚拟机栈详解 (juejin.cn) (opens new window)

# happens-before是啥

这个东西主要是为了解决并发编程中多线程的可见性。

为了方便程序员开发,将底层的烦琐细节屏蔽掉,JMM定义了Happens-Before原则。只要我们理解了Happens-Before原则,无需了解JVM底层的内存操作,就可以解决在并发编程中遇到的变量可见性问题。

JVM定义的Happens-Before原则是一组偏序关系:对于两个操作A和B,这两个操作可以在不同的线程中执行。如果A Happens-Before B,那么可以保证,当A操作执行完后,A操作的执行结果对B操作是可见的。

Happens-Before的规则包括:

  1. 程序顺序规则
  2. 锁定规则
  3. volatile变量规则
  4. 线程启动规则
  5. 线程结束规则
  6. 中断规则
  7. 终结器规则
  8. 传递性规则

参考

  1. 从Java多线程可见性谈Happens-Before原则 - SegmentFault 思否 (opens new window)
编辑 (opens new window)
上次更新: 2021/03/31, 20:52:00
IO NIO框架
类加载机制

← IO NIO框架 类加载机制→

Theme by Vdoing | Copyright © 2021-2021 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式