自己整理的一些资料以及自己的一些理解,希望记下来的不是高大上而晦涩的概念,将自己此时此刻的理解最大程度地刻模,以便将来重温知新。

JVM内存结构最简单可以初步分为:1栈 2堆 3方法区 4 程序计数器

一、栈区

方法每次被线程调用都会在栈区开辟新的内存空间——栈帧,每个线程包含一个栈帧,每个栈帧中的数据(基本数据类型和对象引用)都是私有的,其他栈帧不能访问,也就是说,同一个方法的不同线程执行彼此是互不干扰的。

栈分为三个部分:基本类型变量区、执行环境上下文(字面意思)、操作指令区(存放操作指令)

二、堆区

栈存储的是基本数据类型和对象引用,而堆存储的全部是对象。

每个对象都包含一个与之对应的class的信息(class的目的是查看方法区是否有对应的字节码文字对象,有就创建对象)

每个线程包含一个栈帧,堆区不同,JVM里只有一个完整的堆区被所有线程共享。

三、方法区

又称为静态区,与堆一样,被所有线程共享。

方法区包含的都是在整个程序中永远唯一的元素,如:class文件(包含类的字段、方法、接口、常量池(用来存储编译期间生成的常量信息,如字面量和符号引用)等)和static变量

四、程序计数器

在通用的计算机体系中,程序计数器用来记录当前正在执行的指令,在JVM中也是如此,它是一块比较小的内存空间。

一个线程的执行,是通过字节码解释器改变当前线程的计数器的值,来获取下一条需要执行的字节码指令,从而确保线程的正确执行。

为了确保线程切换后(上下文切换)能恢复到正确的执行位置,每个线程都有一个独立的程序计数器,各个线程的计数器互不影响,独立存储。也就是说程序计数器是线程私有的内存。

程序计数器是随他的线程共存亡的,线程开始,程序计数器创建,线程结束,程序计数器消亡。

由于Java支持多线程,Java中的程序计数器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined。

注意!这个区域是唯一一个不抛出OutOfMemoryError的运行时数据区。

总结:初步认识JAVA内存结构对于初步的入门学习足够了,知道栈里存储对象引用与基本数据类型,堆里存储对象,方法区里存储静态变量和方法还有class文件里的字段与接口,主要是方法!

- - - - - -  - - -- - - - - - - - -  - - - - - - - - - -  - - - -- - - - -  - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - -  - - - - -

再可以知道比如:

java六大存储区域:

1 寄存器 最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。知道就好,因为寄存器数量有限,所以寄存器由编译器按需分配,我们不能直接控制,我们在程序中碰不到他。

2 栈 见上述

3 堆 见上述

4 静态存储区,其实就是方法区,见上述

5 常量存储  常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中。

(声明为final static的为常量,可以保存在常量储存区,还有String类型的对象都是常量,系统维护了一个String常量池。 String类型是final修饰的,无法被继承)

6 非RAM存储 数据完全存活于程序之外,不受程序控制,程序不运行他也可以存在。

另外:

上述中说的栈、堆、都放在RAM(主存)中,常量存储有时候可以放在ROM(只读内存)中。

java:JVM内存结构初步理解入门:堆、栈、方法区(浅显通俗易懂自记)相关推荐

  1. JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系

    文章目录 Pre 示例demo 总体关系 代码示例论证 反汇编 Pre JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器 中我们探讨了线程栈中的内部结构 ,大家 ...

  2. java JVM 内存结构

    一.java虚拟机内存结构: JVM是一种规范. 1.线程共享:堆.方法区 线程独享:虚拟机栈.本地方法栈.程序计数器 2.堆:是垃圾回收的主要区域 堆的内存又根据垃圾回收分为: (1).新生代:Ed ...

  3. JVM堆 栈 方法区详解

    一.栈 每当启用一个线程时,JVM就为他分配一个JAVA栈,栈是以帧为单位保存当前线程的运行状态 栈是由栈帧组成,每当线程调用一个java方法时,JVM就会在该线程对应的栈中压入一个帧 只有在调用一个 ...

  4. JVM Runtime Data Area(运行时数据区中的堆/栈/方法区讲解)

    JVM的组成 JVM由4大部分组成:ClassLoader .Runtime Data Area .Execution Engine .Native Interface.我们这里重点讲得是Runtim ...

  5. java多线程构造函数_java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解...

    多线程与JVM内存结构的关系[了解]: 对于最后一个有疑问的构造中stackSize参数,其实学过编程滴人从参数字面就比较容易理解,栈大小嘛,这里从官方文档上来了解一下这个参数: 而之前在学习java ...

  6. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  7. java 堆内存结构_基于JDK1.8的JVM 内存结构【JVM篇三】

    在我的上一篇文章别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析[JVM篇二]中,相信大家已经对java类加载机制有一个比较全面的理解了,那么类加载之后,字节码数据在 ...

  8. JVM之深入理解JVM内存结构(Java内存结构/Java内存区域)、Java内存模型

    Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的JVM内存结构.JAVA内存结构.JAVA内存 ...

  9. 快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!

    现如今你是否有这样的感觉,无论生活还是学习,节奏都是非常的快,每天面对海量的知识信息,自己感觉都要hold不住了,每天打开微信公众号,是不是发现有几十条未读,无论是技术文章还是其他类型的文章,我们大多 ...

最新文章

  1. WEB攻击手段及防御第2篇-SQL注入
  2. Jmeter学习——11
  3. Bellman-Ford 单源最短路径算法
  4. UI设计:掌握这6点,轻松0到1
  5. DatabaseMetaData.getIndexInfo
  6. robotstudio仿真搬运编程_敲黑板 | 机器人是怎么完成任务的?这三种编程方式的区别你造吗...
  7. 11g rac生产环境异机恢复报错RMAN-6013
  8. 在mysql中插入日期
  9. openwrt是嵌入式linux,非常方便的OpenWrt的嵌入式Linux开发环境
  10. c# 用空格分割字符串_C#| 左用空格填充字符串
  11. 前端开发 表单控件高级 0303
  12. AcWing 204. 表达整数的奇怪方式 / Strange Way To Express Integers
  13. Vue-CLI3.x 高版本覆盖低版本Vue-CLI2.x 解决方法
  14. 安装freetds小记
  15. 基于WEB的自行车租赁管理系统设计与实现
  16. 腾讯(Tencent)2022实习笔试算法题
  17. 麦克风测试软件 ios,iOS开发麦克风权限判断
  18. C++开发USB时缺少winusb.h头文件
  19. 用尽可能多的字数介绍Leaky ReLU激活函数
  20. 深耕ElasticSearch - 认识搜索引擎的索引

热门文章

  1. 使用最小二乘法拟合由分段函数构成的广义贝塔分布的参数
  2. Deno 1.0,来了解一下
  3. 开源版客服代码-在线客服系统源码_网页聊天室源码_龙塘智能客服_znkefu
  4. 生产者-消费者问题【操作系统学习笔记】
  5. 重磅!数字人民币接入支付宝!
  6. 各种进制转换最简单总结(附任意进制转换代码)
  7. 怎么把移动硬盘挂载到linux,linux 如何挂载移动硬盘
  8. Fabric-跨链码访问
  9. 国外常用的7个大数据分析软件
  10. 快速提高英语口语方法:自己和自己练习口语