各个JAVA场景下的内存图
来源:互联网 发布:淘宝卖家中心登录网 编辑:程序博客网 时间:2024/06/05 03:27
首先,内存模型图,如下:
其次,一句话概括各个区域的作用:
1:程序计数器(Program Counter Register),让虚拟机中的字节码解释器通过改变计数器的值来获取下一条代码指令,比如分支、循环、跳转、异常处理、线程恢复等;
2:Java 虚拟机栈(Java Virtual Machine Stacks),栈顶存放当前方法,里面有局部变量表,
3:本地方法栈(Native Method Stacks),本地方法栈则,是为虚拟机使用到的Native 方法服务,作用同虚拟机栈。
4:Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
5:方法区(Method Area)与Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
Object obj = new Object();
假设这句代码出现在方法体中,那:
1:首先包含这个方法体的类首先被加载到方法区中;
2:其次方法体本身被压栈进虚拟机栈;
3:“Object obj”这部分的语义将会反映到虚拟机栈的本地变量表中,作为一个reference 类型数据出现。
4:而“new Object()”这部分的语义将会反映到Java 堆中,形成一块存储了Object 类型所有实例数据值(Instance Data,对象中各个实例字段的数据)的结构化内存,这块内存的地址存储在虚拟机栈。另外,在Java 堆中还必须包含能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中。
以上过程,用一个更具体的例子,就是如下:
附件:关于虚拟机栈访问堆中的数据,有两种方式,如下:
由于reference 类型在Java 虚拟机规范里面只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,以及访问到Java 堆中的对象的具体位置,因此不同虚拟机实现的对象访问方式会有所不同,主流的访问方式有两种:使用句柄和直接指针。
如果使用句柄访问方式,Java 堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息,如下图所示。
如果使用直接指针访问方式,Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,reference 中直接存储的就是对象地址,如下图所示
- 各个JAVA场景下的内存图
- xib 加载另一个 xib的各个场景
- Redis各个数据类型的使用场景
- Redis各个数据类型的使用场景
- java虚拟机内存的各个区域以及各个区域的作用
- java内存泄漏常见场景
- 内存各个区域的区别
- java中如何获取项目各个目录下的文件
- java中如何获取项目各个目录下的文件
- java中如何获取项目各个目录下的文件
- java.util.Collection包下各个类的特点汇总
- java.util.Map包下各个类的特点汇总
- java.util.Collection包下各个类的特点汇总
- java的synchronized的使用场景简介以及在不同场景下的差异
- 如何测试 Mediatek 平台各个场景的功耗数据?
- 数据库各个派系的起源和应用场景
- Cocos Creator各个场景之间传递数据的方法
- 电商秒杀架构 各个具体场景及对应的解决方案
- Go的组合继承
- 我使用过的框架的基本涵盖所有版本CDN网址
- 最小生成树 堆优化的Prim算法
- jsp 基础语法
- throw和throws的区别
- 各个JAVA场景下的内存图
- CodeForces 834C The Meaningless Game
- 欢迎使用CSDN-markdown编辑器
- QT-程序图标设置
- Oil Deposits ——DFS&&BFS
- 13改变HTML样式
- 解决react vr加载js模型失败的问题
- java ajax实现异步同步请求全面详解
- Android之ViewPager+Fragment实现懒加载