Java 内存区域和内存溢出
Java 内存区域和内存溢出
本文主要介绍Java 虚拟机内存的各个区域。
围绕两方面内容展开:
- 运行时数据区域有哪几块 分别有什么作用?
- 如何创建对象,使用对象,对象是什么?
1.运行时数据区域
Java运行时的数据区域包括方法区、虚拟机栈、本地方法栈、堆、程序计数器。
- 方法区:线程共享的,存放类信息、常量、静态变量等。
- 虚拟机栈:线程私有的,存储 局部变量,描述的是java方法执行的线程内存模型,从入栈到出栈的过程。
- 本地方法栈:与虚拟机栈的区别就是执行方法的区别,本地方法栈存放native方法的信息。
- 堆:线程共享的,对象存储地。GC管理的就是这块。参数-Xmx -Xms调的也是这块
- 程序计数器:当前线程所执行的字节码的行号指示器。多线程之间相互独立。
2.虚拟机对象
2.1 对象的创建过程
2.2 对象的内存布局
对象主要由对象头、实例数据、对齐填充三个部分组成
- 对象头:一部分包含存储对象自身的运行数据(HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等),另外一部分是类型指针:对象指向他的类型元数据的指针。如果是JAVA数组,还有一块记录数组长度的数据
- 实例数据:在代码中定义的各种类型的字段内容
- 对齐填充:为了满足对象的长度是8字节的倍数
2.3 如何访问对象
通过栈上的reference来操作堆上的具体对象,reference是对象的一个引用,那么这个引用是如何定位到对象的呢?
-
通过句柄
从堆中划分出句柄池,句柄包含了对象实例数据和各类型数据各自具体的地址信息。好处是对象被移动的时候只需要改变句柄中的指针地址就好了。
-
直接指针
reference存储的就是对象地址。好处是块,减少了中间成本。
链图片转存中…(img-lCprCGz5-1721553343002)]
-
直接指针
reference存储的就是对象地址。好处是块,减少了中间成本。
参考文献:
- 《深入理解Java虚拟机 --周志明》
原文地址:https://blog.csdn.net/weixin_47467016/article/details/140590707
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!