日常学习-jvm01-java 内存模型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了日常学习-jvm01-java 内存模型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3267字,纯文字阅读大概需要5分钟。
内容图文
![日常学习-jvm01-java 内存模型](/upload/InfoBanner/zyjiaocheng/931/6bb792f5238f4ec4b41ba6160d32ec82.jpg)
java 内存模型
线程隔离:线程独有的内存空间 ,相互不影响
1 程序计数器
? 当前线程所执行字节码的行号指示器,通过改变计数器的值,来确定执行的下一条字节码指令
2 虚拟机栈
? 每个方法被执行时,虚拟机都会同步创建一个栈帧,栈帧中存储着 局部变量表、操作数栈、动态链接、出口信息等。
? 每个方法的开始到结束,对应着栈帧从入栈到出栈的过程
? 局部变量表:存放了编译期可知的java基础类型,对象引用和returnAddress指向一条字节码指令的地址
异常
-
1 若线程请求的栈深度大于虚拟机允许的深度,则会报出StackOverflowError
-
2 若java虚拟机栈容量可以动态扩展,却无法申请到更多的内存空间时 也会报出outOfMemoryError
3 本地方法栈
? 虚拟机使用到本地方法,则会压入到本地方法栈。
异常与虚拟机栈类似
线程共享
1 java 堆 **
? 此内存区域的唯一目的就是为了存储实例对象
? java 堆 实际处于内存不连续的空间,但在逻辑上 要看作为连续的对象, 但是大对象由于需求会被要求存储在连续的空间上
? java 堆可以被实现为可扩展,也可固定大小不过大多数都是可扩展
? - Xmx java 堆可以被分配最大的内存空间
? - Xms java 堆可以被分配起始的内存空间
异常
若实例对象无法被分配空间,并且内存空间无法扩展时 会爆出 OutOfMemoryError异常
2 方法区
用于存储已被虚拟机加载的类型信息、常量、静态变量
可以选择扩展大小或者固定长度
可以选择不进行垃圾收集,针对这个区域的内存回收 主要是类的卸载和常量池的回收
利用元空间来进行实现
3 运行时常量池
运行时常量池是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池表(用于存放编译期生成的各种字面量和符号引用)
既然运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError 错误。
4 直接内存
直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致 OutOfMemoryError 错误出现。
本机直接内存的分配不会受到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。
HotPot 虚拟机对象探秘
1 对象的创建
当虚拟机遇到一条字节码 new 时
1 检查这个指令的参数能否 在常量池中定位到一个类的符号引用,并且检查这个类是否被加载初始化过。如果没有则需要先进行类得加载
2 虚拟机额需要为这个新对象分配内存空间
-
2.1 如果 内存空间中的对象分布是绝对规整的,一边全是对象,一边是空闲,一个指针指向两块区域的交界处,分配空间是,将会让这个指针 向空闲区域移动一个对象的大小。这种方式成为"指针碰撞"。
-
2.2 如果 该内存区域对象分布是不规整的,虚拟机就需要维护一个列表,来表示哪些区域的内存是空闲着的。分配时,虚拟机通过表找到一块足够大的区域划分给对象实例,并且更新空闲列表。该方式称之为"空闲列表"
-
2.3 那么当多个线程同时进行,会产生线程不安全的问题 ,因为多个线程同时去分配内存,导致指针或空闲表更新不及时,分配了相同的内存空间。
-
CAS 利用失败重试的方法来分配内存
-
TLAB 为线程预先分配缓存,当需要分配时现在本地缓存中进行分配 若缓存满了 再在内存上划分新的缓存
-XX:+/-UseTLAB
-
3 java 对对象进行必要的设置,将必要的信息存放在对象头中,同时设置是否使用偏向锁等等。
? 对象头:
? Mark Word: 这部分主要用来存储对象自身的运行时数据,如hashcode、gc分代年龄等
? class pointer: 这一部分用于存储对象的类型指针,该指针指向它的类元数据,JVM通过这个指针确定对象是哪个类的实例。
? array length: 如果对象是一个数组,那么对象头还需要有额外的空间用于存储数组的长度
4 最后 执行构造函数,并且进行赋值等操作
2 对象的访问方式
- 使用句柄访问
- 优势 : 当对象存储空间发生变化是 只需要改变句柄中的指针即可,不用改变实际引用的地址
- 直接指针访问
- 优势 : 速度较快,减少了一次指针定位的过程。
参考于《深入理解java虚拟机第3版》
内容总结
以上是互联网集市为您收集整理的日常学习-jvm01-java 内存模型全部内容,希望文章能够帮你解决日常学习-jvm01-java 内存模型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。