形象谈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.网络.多线程,偶尔 ...
随机推荐
- Vue3.3 的新功能的一些体验
Vue3 在大版本 3.3 里面推出来了一些新功能(主要是语法糖),网上有各种文章,但是看起来似乎是一样的. 我觉得吧,有新特性了,不能光看,还要动手尝试一下. DefineOptions 宏定义 先 ...
- 回溯理论基础及leetcode例题
学习参考 回溯 与递归相辅相成;回溯是递归的副产品,只要有递归就会有回溯. 回溯函数也就是递归函数,指的都是一个函数. 回溯搜索法 纯暴力搜索 解决的问题 组合问题:N个数里面按一定规则找出k个数的集 ...
- 2022年第十四届四川省大学生程序设计大赛 A
A Adjacent Swapping 题意: 给定一个字符串,每次可以移动相邻字符,求最小移动次数可以把它变成s+s这样左右两边相同的字符串. 思路: 1:我们知道他一定是偶数长度,所以我们把字符串 ...
- Linux 上的 .NET 崩溃了怎么抓 Dump
一:背景 1. 讲故事 训练营中有朋友问在 Linux 上如何抓 crash dump,在我的系列文章中演示的大多是在 Windows 平台上,这也没办法要跟着市场走,谁让 .NET 的主战场在工控 ...
- synchronized中wait、notify的原理与源码
synchronized中wait.notify的原理与源码 1.wait和notify的流程图 2.JVM源码 java层面wait的方法 public final native void wait ...
- TCP/IP协议发明人G-Cerf
如果你是一个IT人,你可以不知道Vinton G. Cerf博士,但你不可能不知道TCP/IP; 如果你不是一个IT人,你可以不知道TCP/IP,但你不可能不知道互联网; 如果从1973年起,Vint ...
- prometheus Histogram 统计原理
大家好,我是蓝胖子,书接上文,我在prometheus描点原理那一篇文章里,留了一个思考题: 我们通常会用到histogram_quantile去计算服务接口时间的耗时情况. histogram_qu ...
- CF1580C Train Maintenance题解
我们以 \(\sqrt m\) 为分界点来进行平衡. 设当前在进行第 \(k\) 次操作,询问 \(i\). 对于 \(x_i + y_i \leq \sqrt m\),可以在 \(last_{x_i ...
- 利用java来实现计算器的加减乘除
package bag; import java.util.Scanner; public class Demo06 { public static void main(String[] args) ...
- Java_Day16_作业
A:简答题 1.请把我们讲解过的所有类中的方法在API中找到,并使用自己的话进行描述 答案: Map public V put(K key, V value): public void clear() ...