形象谈JVM-第四章-JVM内存结构
给我一个CPU,给我一块内存,我来执行一段代码。
我要如何分配呢?

new User();
这里有一个有一个User类,如果我要new出来User对象,必须先知道它长什么样子,我先搞一块区域出来,把User类的样子给存下来。
可以把“User类的样子” 比作造房子的“图纸”或者“模板”;

这块区域命名为方法区。
那方法区应该保存类的哪些信息呢?
我想一下,应该是只要程序运行时需要用到的类的数据都要保存下来吧。
比如,类型信息、方法信息,常量、静态变量、即时编译器编译后的代码缓存等数据。
既然这个区域要把所有的类的信息都记录下来,每个线程都可能需要这些信息的,那就是要让所有线程都能访问的。

new User();
然后是要new一个新的User类对象,我先从方法区获取User类信息,再新建这个对象,再直接在内存里存起来不就好了,但是如果我下次想要获取这个对象,好像就没办法找到,因为只是分配了内存给这个新对象,却没有记录这个实例对象的任何信息,所以没办法获取到这个对象,这种方式行不通。
于是有了这种写法
User user1 = new User();
这样好像合理了很多,user1存储了新建的User类对象的地址值,这样我只要知道记住引用变量user1,就能知道我新建的User类对象了。

User user1 = new User();
=号前面的部分和=号后面的部分,这两个部分的功能不一样,最好给他们分类,放在不一样的地方存放。
=号前面的部分放置区域叫虚拟机栈,具体是放在虚拟机栈的栈帧中。

每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表:存放方法参数和方法内定义的局部变量
操作数栈:存放被操作数据的栈结构,1+2对应的操作数栈是1,2。
动态链接:动态链接的作用就是为了将这些符号引用转换位调用方法的直接引用。
方法出口:正常完成出口,异常完成出口
为什么前面要强调是虚拟机栈呢,因为还有个本地方法栈,java语言中有native修饰的本地方法,其调用的可能就是c,c++语言写的方法,而不是java方法,因此才又分出来一个区域,但是他们的作用是非常相似的。

=号后面的部分放置区域叫堆,主要是用来放实例的数据的。

方法的是通过压栈和弹栈的方式来执行的。
线程之间的执行是通过抢占CPU时间片资源的,因此线程之间会不断的切换,还要划分一块区域出来专门存储线程执行的进度,要不然下次切换回来都不知道要从哪个地方继续了。
这块区域叫PC寄存器,也可以叫程序计数器。

上图红色区域为线程共享的,其他为线程私有的。
下一个章节,会讲解堆区的分配及原因和垃圾回收机制,可以点个关注!!!
形象谈JVM-第四章-JVM内存结构的更多相关文章
- 第四章 JVM垃圾回收算法
说明:在阅读本篇之前,需要知道怎么判断对象的存活与否,见<第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程> 注意:本文主要参考自<分布式Java应用:基础与实践& ...
- jvm系列四、jvm知识点总结
原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...
- Windowsw核心编程 第13章 Windows内存结构
第1 3章 Wi n d o w s的内存结构 13.1 进程的虚拟地址空间 每个进程都被赋予它自己的虚拟地址空间.对于 3 2位进程来说,这个地址空间是4 G B,因为3 2位指针可以拥有从0 x ...
- 你还在为了JVM而烦恼么?(内存结构和垃圾回收算法)
做JAVA也有接近2年的时间了,公司的leader说,做JAVA,三年是个坎,如果过了三年你还没有去研究JVM的话,那么你这个程序员只能是板砖的工具了.恰逢辞职,来个JVM的解析可好? JVM是J ...
- JVM(四)JVM的双亲委派模型
1.两种不同的类加载器 从JAVA虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分:另 ...
- JVM学习四:JVM之类加载器之初始化分析
在经过了前面的加载 和 连接分析之后,这一节我们进入重要的初始化分析过程: 一.认识初始化 初始化:这个似乎与上面的初始化为默认值有点矛盾,我们再看一遍:为累的静态变量赋予正确的初始值,上面是赋予默 ...
- 第五章 JVM垃圾收集器(1)
说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法> 1.七种垃圾收集器 Serial(串行GC)-- 复制 ParNew(并行GC)-- ...
- 深入探究JVM之内存结构及字符串常量池
前言 Java作为一种平台无关性的语言,其主要依靠于Java虚拟机--JVM,我们写好的代码会被编译成class文件,再由JVM进行加载.解析.执行,而JVM有统一的规范,所以我们不需要像C++那样需 ...
- JVM学习一:JVM之类加载器概况
18年转眼就3月份都快结束了,也就是说一个季度就结束了:而我也因为年前笔记本坏了,今天刚修好了,那么也应该继续学习和博客之旅了.今年的博客之旅,从JVM开始学起,下面我们就言归正传,进入正题. 一.J ...
- 深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理
微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔 ...
随机推荐
- Redis数据结构三之压缩列表
本文首发于公众号:Hunter后端 原文链接:Redis数据结构三之压缩列表 本篇笔记介绍压缩列表. 在 Redis 3.2 版本之前,压缩列表是列表对象.哈希对象.有序集合对象的的底层实现之一. 因 ...
- 【实践篇】领域驱动设计:DDD工程参考架构
背景 为什么要制定参考工程架构 不同团队落地DDD所采取的应用架构风格可能不同,并没有统一的.标准的DDD工程架构.有些团队可能遵循经典的DDD四层架构,或改进的DDD四层架构,有些团队可能综合考虑分 ...
- webpack Dev Server Invalid Options options should NOT have additional prop
今日npm run serve时提示ERROR ValidationError: webpack Dev Server Invalid Options options should NOT have ...
- Python基础 - 赋值运算符
以下假设变量a为10,变量b为20: 运算符 描述 实例 = 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c += 加法赋值运算符 c += a 等效于 c = c + a ...
- 荣登国家级榜单!ShowMeBug创始人李亚飞入选「科创中国·青年创业榜」
近日,中国科协召开2022"科创中国"年度会议,会上发布了2021"科创中国"系列榜单.其中,ShowMeBug 创始人&CEO李亚飞入选2021年科创 ...
- 腾讯云 cloudbase 云开发使用笔记
产品概述 云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为开发者提供高可用.自动弹性扩缩的后端云服务,包含计算.存储.托管等 serverless ...
- 计算机视觉重磅会议VAlSE2023召开,合合信息分享智能文档处理技术前沿进展
近期,2023年度视觉与学习青年学者研讨会 (Vision And Learning SEminar, VALSE) 圆满落幕.会议由中国人工智能学会.中国图象图形学学会主办,江南大学和无锡国家高新技 ...
- 10分钟讲清int 和 Integer 的区别
其实在Java编程中,int和Integer都是非常常用的数据类型,但它们之间存在一些关键的区别,特别是在面向对象编程中.所以接下来,就让我们一起来探讨下关于int和Integer的区别这个问题吧. ...
- Vue3从入门到精通(三)
vue3插槽Slots 在 Vue3 中,插槽(Slots)的使用方式与 Vue2 中基本相同,但有一些细微的差异.以下是在 Vue3 中使用插槽的示例: // ChildComponent.vue ...
- Collection 接口及其常用方法
Collection 接口的特点 Collection接口没有直接实现类,提供了更具体的子接口(如Set和List)的实现.Collection实现类(通常通过其中一个子接口间接实现Collectio ...