深入理解JVM--JVM结构
深入理解JVM--JVM结构
JVM模型:
- 虚拟机栈(JVM Stack):一个线程对应一个JVM Stack,一个JVM Stack中包含一组栈帧(Stack Frame),栈帧是一组数据结构,封装了方法的局部变量表,动态链接信息,方法的返回地址以及操作数栈等信息。每一个方法都是一个对应的“帧”,方法的运行实际上就是入栈和出栈的过程。 栈帧的结构图:
- 局部变量表(LocalVariableTable):
- 每一个方法都有对应的局部变量表,用于存储方法中的局部变量,局部变量的个数≥1,所有方法都会默认传入this变量
- 局部变量的容量以 变量槽(Variable Slot) 为最小单位,每个slot占据32个字节,执行实例方法时,索引为0的slot默认存储this变量,其它变量从1索引处开始存储
- 基本数据类型在局部变量表中占据1个 slot,但是大数据类型,long和double占据2个slot
- 动态连接: 可以看作不可使用的指针,指向位于常量池中的实例对象,引用访问对象的方式有2种,JVM一般使用第二种
- 句柄方式:引用指向堆中的一个句柄,该句柄一部分存储堆中目标实例对象的真实地址,另一部分存储方法区中实例对象的class对象的真实地址
- 直接指针方式:该引用指向堆中的一个对象,该对象一部分存储目标实例对象,另一部分依旧存储方法区中实例对象的class对象的真实地址
- 与动态连接相对应的是静态解析,即在类的加载阶段即将类中静态变量的符号引用转换为直接引用。值得注意的是:类中的静态变量会在类的加载阶段和类的真实class对象一起存储在方法区中。
- 操作数栈: 与我们认知中的栈结构相似,先进后出的数据结构,里面主要通过相关代码(助记符)来操作方法中的局部变量与局部变量表(bytecode/MyTest08)
- 返回地址: 方法开始执行后,只有 2 种方式可以退出 :方法返回指令,异常退出。
- 栈数据区: 帧数据区的大小依赖于 JVM 的具体实现。
- 可以在运行设置中用-Xss指令来指定栈所占用的最大内存,如:-Xss160k
- 局部变量表(LocalVariableTable):
- 本地方法栈: 主要用于处理本地方法(即不是由JAVA语言编写,而是由C或C++编写的方法),运行方式与虚拟机栈相似,在一些JVM中,会把本地方法栈和虚拟机栈合为一起。
- 程序计数器: 记录着当前线程所执行的字节码的行号指示器
- 堆(Heap):
- JVM 管理的最大的一块内存空间,主要用于存放Java类的实例对象,其被划分为两个不同的区域:新生代 ( Young )和老年代 ( Old ),其中新生代 ( Young )又被划分为:Eden、From Survivor和To Survivor三个区域
- 堆中存储实例对象有2种方式,一般是第二种
- 指针碰撞(前提是堆中的空间是连续的且通过一个指针分割,一边是已被占用的内存,另一边是未被占用的内存)
- 空闲列表(前提是堆中的内存是不连续的且已被使用的空间和未被使用的空间交织在一起,这时,虚拟机需要通过一个列表来记录
- new关键字创建对象的3个步骤
1. 在堆内存中创建对象实例(new)
2. 为对象中的实例变量赋值(invokespecial)
3. 将对象的引用返回(dup)
4. new语句一共会消耗12个bytes,JVM规定引用占4个bytes,空对象占8个bytes - 可用 -Xms1m -Xmx1m 指定堆的最小内存和最大内存,如上面的指令代表最小内存与最大内存均为1m
- 方法区:
- JDK1.7前的永久代(Permanent Generation)其实是方法区的实现,方法区和永久代是不同的,从JDK 1.8开始,已经废弃永久代。使用元空间(meta space),用于存储静态变量、元数据(class对象)与常量池,元空间深度解析:https://www.infoq.cn/article/Java-permgen-Removed
- JVM监视调优相关工具
深入理解JVM--JVM结构相关推荐
- java多线程构造函数_java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解...
多线程与JVM内存结构的关系[了解]: 对于最后一个有疑问的构造中stackSize参数,其实学过编程滴人从参数字面就比较容易理解,栈大小嘛,这里从官方文档上来了解一下这个参数: 而之前在学习java ...
- java:JVM内存结构初步理解入门:堆、栈、方法区(浅显通俗易懂自记)
自己整理的一些资料以及自己的一些理解,希望记下来的不是高大上而晦涩的概念,将自己此时此刻的理解最大程度地刻模,以便将来重温知新. JVM内存结构最简单可以初步分为:1栈 2堆 3方法区 4 程序计数器 ...
- 【深入理解JVM】学习笔记——-1、JVM基本结构
借花献佛:本篇主要来了解: 什么是jvm?JVM的基本结构, 也就是概述.说是概述,内容很多,而且概念量也很大, 不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形, 所以只要你有 ...
- JVM之深入理解JVM内存结构(Java内存结构/Java内存区域)、Java内存模型
Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的JVM内存结构.JAVA内存结构.JAVA内存 ...
- Jvm 系列(二):Jvm 内存结构
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...
- Java 内存模型和 JVM 内存结构真不是一回事
这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...
- 面试官问我JVM内存结构,我真的是
面试官:今天来聊聊JVM的内存结构吧? 候选者:嗯,好的 候选者:前几次面试的时候也提到了:class文件会被类加载器装载至JVM中,并且JVM会负责程序「运行时」的「内存管理」 候选者:而JVM的内 ...
- 详解JVM内存结构(基于JDK8)
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
- jvm系列(二):JVM内存结构
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...
- [java] 虚拟机(JVM)底层结构详解[转]
[java] 虚拟机(JVM)底层结构详解[转] 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领 ...
最新文章
- oracle数据导入-dblink方式
- 引:善用backtrace解决大问题
- 指定父对象和信号与槽
- Spring和JSF集成:导航
- SAP创建新的项目类型
- 适配器模式之对象适配器
- java中的强制类型转换注意事项_浅谈Java中强制类型转换的问题
- .NET下添加Redis
- getchar()不停止原因
- C#爬取数据_详细篇
- 多少个程序员能出一个架构师_每个程序员或架构师都应该知道的9 + 7件事
- 水洼数dfs(java)
- 【dqmp项目笔记】
- 有一分热,发一分光,用Python 爬取鲁迅先生《经典语录》
- 调整el-datetimepicker时间选择器的样式大小
- 计算机系统的体系结构论文,计算机系统结构参考文献
- lisp 中望cad 选项卡_CAD应用技巧:中望CAD中加载LISP程序
- T2080 U-BOOT与OS内核移植 u-boot移植篇(一)——创建新目标板的u-boot工程
- 如何创建网站:2021年看这份指南就够了
- eclipse怎样显示行数
热门文章
- VC 6.0下载 VC 6.0英文版下载 Visual C++ 6.0 英文企业版 集成SP6完美版(最新更新地址,百度网盘)...
- 项目上拿来的 有演示 类似kindlePush微信小程序 内容值得
- 利用原生JS将下载链接转换为二维码
- C++ 调用 SWMM模型.swmm5.dll
- 互联网扫描器 ZMap 完全手册
- 产品经理的简历怎么写?
- 9、ffplay音频的波谱图及频谱图源码分析
- 先面对现实,再寻找理想
- 《数字图像处理》实验五
- C++信息学奥赛一本通_1020