首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
Java 5大内存区域
时间:
2018-06-29 20:39:05
阅读:
238
评论:
0
收藏:
0
[点我收藏+]
标签:
修改
性能
nbsp
避免
虚拟机
变化
编译器
1.7
文件的
1.Java运行时数据区
方法区,堆线程共享。虚拟机栈,本地方法栈和程序计数器线程私有。
2.程序计数器(PC计数器)
占用较小的一块内存空间,当执行Java方法时记录正在执行的虚拟机字节码指令地址,如果执行Native方法则计时器值为空。
3.Java虚拟机栈
java方法执行时的内存模型
查看Java虚拟机栈详细
3.1 栈帧
每个方法都会在虚拟机栈中创建一个对应的栈帧,用于存储
局部变量表
,操作数栈,动态链接,方法出口等信息。
一个方法的调用到结束就对应这一个栈帧从虚拟机栈入栈到出栈。
4.栈内存和堆内存
一般我们说的栈内存和堆内存的栈就指虚拟机栈内存或者就指局部变量表,堆就是堆内存。最关心的也就是这两块。
5.本地方法栈
本地方法栈和虚拟机栈作用相似,虚拟机栈为虚拟机执行java方法(字节码)服务,本地方法栈为jvm使用Native方法服务。
本地方法 关键字 native ,这些方法一般用来调用本地方法库中的方法这些方法操作底层大多用C 实现。
有的虚拟机将本地方法栈和虚拟机栈合在一起,如HotSpot。
6.java堆
最大的一块内存,存放对象实例的地方。
Java堆是垃圾收集器管理的主要区域,也称GC堆。
Java堆物理上可不连续,逻辑上连续。
堆中没有完成实例分配,并且对也无法在扩展时抛出 OutOfMemoryError异常
7.方法区
存已经被虚拟机加载的类信息(Class对象)、常量、静态变量、即时编译器JIT编译过后的代码数据。
jdk 1.7、1.8 对方法区做出了修改,1.8 取消了方法区。
方法区被Java虚拟机规范描述为堆的一个逻辑部分,但它不是堆,有一个别名叫非堆Non-Heap
jdk1.6 及之前方法区位于永久代(PermGen),永久代和堆相互隔离。
方法区可以不需要连续的内存空间,也可以固定大小,也可以扩展,也可以不实现垃圾收集,如果实现则主要针对
常量池
的回收和类型的卸载。
7.4 运行时常量池
在方法区,用来存放
编译期生成的各种符号引用和字面量
。
编译期将各种符号引用和字面量放置在class文件的
常量池
中,解析后在
运行时常量池
,字符串在方法区的
字符串常量池
中(1.7之前),方法运行时复制到
局部变量表
中。
符号引用: String ss = "asdsfg" ss这个符号就是符号引用。
解析阶段解析为直接引用
字面量: 值本身 如 asdfg
8.直接内存
并非虚拟机运行时的内存,也不再jvm规范中定义。
在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
9.对象的创建
普通Java对象创建,不包括数组和Class对象。
查看具体对象创建过程和内存分配
类加载 连接 类加载检查
检查通过后为对象分配内存,对象内存大小在类加载时就已经确定了。
将分配的内存初始化为0值,这一步保证了实例字段即使不赋初值也可使用。
对对象进行设置,如对象哈希码,是哪个类的实例,GC分代年龄。
<init> 方法执行,对象执行初始化
。
10.对象内存分布
对象在内存中分为3块区域,对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。
实例数据:包括从父类继承下来的字段,并且将宽度相同的字段分配到一起。
对齐填充:HotSpot VM 的内存自动管理系统要求对象起始地址必须是8字节的整数倍,就是说对象大小必须是8字节整数倍,而对象头正好是8字节的倍数,所以实例数据不够8字节整数倍时会补齐填充。
10.1 对象头
对象头分为2部分,第一部分存储对象自身运行时数据,第二部分存储类型指针。
对象头作用
自身运行时数据(Mark Word):如哈希码、GC分代年龄、锁转态标志、线程持有的锁,偏向线程ID、偏向时间戳。Mark Word是非固定的数据结构,以便存储更多信息,根据对象状态不同各个信息所占位数会变化,但总体肯定是8字节倍数。
类型指针:指向元数据(Class类数据)的指针
如果对象是数组那么对象头还有一块用于记录数组长度的区域,因为普通Java对象通过元数据可以确定大小,而数组的元数据无法确定数组大小。
11.对象定位
主流的访问对象的方式有两种,通过句柄访问和直接访问,HotSpot 采用直接访问。
通过句柄访问就是在堆中有一个句柄池存放对象实例数据与类型数据各自的具体地址,栈中的引用保存句柄的地址,好处是引用保存的地址不会变比较稳定,对象改变也只改变句柄池中的地址。
直接访问就是引用直接指向对象,好处就是速度快。
12.OOM
查看详细内容
Java 5大内存区域
标签:
修改
性能
nbsp
避免
虚拟机
变化
编译器
1.7
文件的
原文地址:https://www.cnblogs.com/mibloom/p/9061379.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!