在java基础当中,有很重要一块的内容,就是关于java当中的内存模型,所涉及的问题无非就是关于java当中的类、实例、变量、常量、静态变量、方法等blabla的东西都分别存储在什么地方。这部分的内容虽然繁琐,但是也是面试当中经常涉及询问的部分,今天就在这里总结一下java当中的内存模型。

首先我们来看一下java的内存模型大体分为了几个部分:

从图片当中可以看到,java运行是的内存模型,大体分为了五个部分:1.方法区(静态区)、2.虚拟机栈、3.本地方法栈、4.堆、5.程序计数器,在每一个不同的部分,分别存储着java运行当中不一样的信息,接下来将分类举例;

1.方法区(又称为静态区,也是GC机制当中的永久带)

1)是被线程共享的一个区域。

2)存储虚拟机加载的类的相关信息,如class、以及static变量、方法信息(包括方法名、参数、返回类型)、域信息等。

3)方法区还包含了常量池,常量池中存储了如字符串、final变量值、类名和方法名常量。

2.虚拟机栈(又称java栈)

1)是一个线程隔离的区域,即私有的,其他线程无法访问的、

2)每个线程创建的时候,jvm就会创建一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 。

3)每个方法执行时都会创建一个栈帧用于存储局部变量表,一个栈区包含多个栈帧,当方法执行的时候生成的栈帧会对应入栈,当方法返回的时候,栈帧将被弹出

4)栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

优点:存取速度比堆要快,仅次于直接位于CPU的寄存器。

缺点:必须确定的是存在stack中的数据大小与生存期必须是确定的,缺乏灵活性。

3.堆

1)是被线程共享的一个区域

2)存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

优点:堆的优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,java的垃圾收集器会自动收取这些不在使用的数据,

缺点:由于要在运行时动态分配内存,存取速度慢。

4.程序计数器

由于Java是支持多线程执行的,所以程序执行的轨迹不可能一直都是线性执行。当有多个线程交叉执行时,被中断的线程的程序当前执行到哪条内存地址必然要保存下来,以便用于被中断的线程恢复执行时再按照被中断时的指令地址继续执行下去。为了线程切换后能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存,这在某种程度上有点类似于“ThreadLocal”,是线程安全的。

5.本地方法栈

本地方法栈和Java栈所发挥的作用非常相似,区别不过是Java栈为JVM执行Java方法服务,而本地方法栈为JVM执行Native方法服务。本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。

(这里也只是抛出了个概念,并没有涉及到这部分的使用,所以我也不是很清楚它是干嘛的)

JAVA基础驿站,Java基础:内存模型相关推荐

  1. java和硬件交互_Java内存模型

    Java内存模型 我们常说的JVM内存模式指的是JVM的内存分区:而Java内存模式是一种虚拟机规范,真实并不存在 Java虚拟机规范中定义了Java内存模型(Java Memory Model,JM ...

  2. Java基础:由JVM内存模型详解线程安全

    1.前言 最近在研究JVM内存模型和Java基础知识.主要讲的是线程共享变量与线程私有变量以及如何写出线程安全的代码.这里列出一条规则,"类中的成员变量,也叫实例变量,也叫全局变量,它是非线 ...

  3. java内存 海子_Android 面试经验 - Java 内存模型 - Java 技术驿站-Java 技术驿站

    Java内存模型 目录 Java执行流程 Java文件被编译成字节码文件之后,由JVM中的类加载器进行加载,加载完毕之后,交由JVM的执行引擎执行.在程序执行的过程中,JVM会用一段空间来存储数据和相 ...

  4. modeler java堆空间,JVM|02内存模型

    JVM内存模型 概述 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保 ...

  5. 8051单片机基础3:C51内存模型(small, compact和large)

    文章目录 C51编译器支持3种内存模型 使用内存模型的方式 1. Small Model 2. Compact Model 3. Large Model 关于作者 C51编译器支持3种内存模型 Sma ...

  6. Java面试题 简述jvm内存模型?

    程序计数器:线程私有,各线程之间独立储存,互不影响,若当前执行的是Java方法,则记录的就是当前执行指令的地址,若是native方法,则为空: java虚拟机栈:线程私有,每个方法在执行时都会创建一个 ...

  7. java 年轻代算法_java内存模型 年轻代/年老代 持久区,jvm中的年轻代 老年代 持久代 gc...

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  8. java 禁止使用多线程_Java多线程(四)-线程状态的转换 - Java 技术驿站-Java 技术驿站...

    一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法 ...

  9. Java常量什么时候被回收,JVM GC调优(2)-GC算法判定对象可以被回收(部分摘自深入理解Java虚拟机) - Java 技术驿站-Java 技术驿站...

    这次我们介绍JVM中的GC算法 引用计数法 可达性分析法 首先我们提出四个问题 哪里的内存需要回收? 什么时候回收? 如何回收? Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的&quo ...

最新文章

  1. 在计算机术语中常用byte表示,2016年计算机一级MS Office上机考试题
  2. 孙宇晨大战Vitalik
  3. POJ-3352-RoadConstruction(边双联通分量,缩点)
  4. Python3的方法解析顺序(MRO)
  5. 攀爬网怎么取消_桂林旅游学院宿舍条件怎么样
  6. 维护人员工具_确保丝印机顺畅使用的维护事项有哪些?
  7. Java 输入输出流 转载
  8. 书山有路28期预告:《人性的枷锁》
  9. hibernate HQL添加语句
  10. Web 探索之旅 | 第二部分第四课:数据库
  11. JAVA Thread的中断机制(interrupt)
  12. ROS在rviz中实时显示轨迹(nav_msgs/Path消息的使用)
  13. rpm、dpkg、yum、apt比较
  14. TextView内部类Layout光标相关方法
  15. 阿里云开发-身份证图像识别(SpringBoot)
  16. 电脑键盘部分按键失灵_键盘按键失灵,教您电脑键盘失灵怎么办
  17. 《设计模式》(博客园精华集)
  18. 互联网+双“高新”时代
  19. Unity Shader标准光照模型——高光反射
  20. 计算机视觉 | 八斗人工智能 (中)

热门文章

  1. 图像处理:如何理解傅里叶变换在图像处理中的应用
  2. 多线程—生产者消费者模式、银行家算法
  3. ios15之取消UITabbleViewCell的高亮效果
  4. IOS之Swift5.x和OC网络请求JSON
  5. vulfocus靶场安装教程
  6. 信息收集 ——C段扫描
  7. php 什么时候销毁对象,什么决定什么时候在PHP中销毁类对象?
  8. k8s里面的项目怎么暴露端口让用户访问_从零开始入门 K8s | 可观测性:监控与日志...
  9. vue中如何实现点击某个地方,让echarts生成的图表发生变化
  10. 验证手机号码归属地_手机号码归属地能否取消? 工信部回复了