Java对象

image

1、对象的创建

1.1、内存分配方式

1、对象内存分配方式分为指针碰撞空闲列表两种,分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有空间压缩整理能力决定
2、内存分配不是线程安全的,jvm解决方案:
方案一:虚拟机采用CAS配上失败重试方式保证原子性
方案二:每个线程在Java堆中预先分配一小块内存,称为本地线程缓存,只有本地缓存用完了,分配新的缓存区时才需要同步锁定,可以通过-XX:+/-UseTLAB 开/关

1.2、内存布局

1、实例数据(对象真正存储的有效信息)
2、对其填充(仅仅起着占位符的作用)
3、对象头(分为:“Mark Word”和“类型指针”)
Mark Word在32位或64位的虚拟机中分别为32个比特或64个比特
类型指针指向它的类型元数据,Java虚拟机通过该指针确定该对象是哪个类的实例
image

1.3、jvm类加载机制

image

1、加载
通过类的全限定名来获取定义此类的二级制字节流
将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
2、验证
文件格式验证,检查class文件格式是否符合规范
元数据验证,主要元数据信息进行语义的检查,以保证其描述信息符合《Java语言规范》的要求
字节码验证,通过数据流分析和控制流分析,主要对方法体进行检查分析
符号引用验证,这个阶段的校验发生在虚拟机将符号引用转化为直接引用的时候
3、准备
给类中定义的变量分配内存空间和设置初始值(这儿的初始值和代码定义的初始值不一样)
4、解析
虚拟机将常量池类的符号引用替换为直接引用
符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义的定位到目标即可
直接引用:可以直接指向目标的指针,相对偏移量或者是一个能间接定位到目标的句柄
5、初始化
会根据程序员通过编码指定的主观计划去初始化变量和其它资源

2、对象访问

image

2.1、句柄访问

Java堆中会分出一块内存来作句柄池,reference中存储的是句柄地址,优势:对象被移动时只会改变句柄中实例数据指针,而reference本身不需要修改

2.2、直接指针访问

reference中存储是对象地址,优势:访问速度快。HotSpot采用

3、对象回收

image

3.1、引用计数算法

在对象中添加一个引用计数器
1、每当一个地方引用它时,计数器加一
2、当引用失效时,计数器减一
3、任何时刻计数器为零时,对象不可使用
4、很难解决对象之间相互循环引用问题

3.2、可达性分析算法

HotSpot采用通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程说走过的路径称为“引用链”,如果对象到GC Roots间没有任何引用链,或者到GC Roots不可达,则对象不可使用。

固定可作为GC Roots对象的:
1、在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如当前正在运行的方法所使用到的参数、局部变量、临时变量等
2、方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量
3、Native 方法中的引用的对象
4、Java虚拟机内部引用,如基本数据类型对应的Class对象,一些常驻的异常对象等
5、所有被同步锁持有的对象

对象引用可分为(都遵循对象回收算法)
强引用,最常用,即类似“Object obj = new Object()”
软引用,在系统要将要发生内存溢出时回收
弱引用,生存到下一次垃圾收集为止
虚引用,一个对象是否存在虚引用,完全不会对其生存时间构成影响

4、其它知识

跨代引用,描述新生代对象引用老年代对象老年代对象引用新生代对象
问题:当新生代发生GC时要扫描整个老年代
解决方案一:跨代引用相对于同代引用来说仅占极少数,解决办法:不用管,随着年龄增长晋升到老年代,跨代引用自动消除
解决方案二:新生代建立一个全局数据结构存放跨代引用对象(该结构称为“记忆集”),新生代发生GC时只扫描记忆集部分

5、虚拟机参数

参数 描述
-verbose:class 类加载和卸载过程打印出来
-XX:+TraceClassLoading 类加载过程打印出来
-XX:+TraceClassUnloading 类卸载过程打印出来
-XX:+TraceClassUnloading 类卸载过程打印出来
-XX:+PrintGCDetails 打印GC详细信息
-XX:+HeapDumpOnOutOfMemoryError 当JVM发生OOM时,自动生成DUMP文件
-XX:HeapDumpPath 生成DUMP文件的路径,一般和-XX:+HeapDumpOnOutOfMemoryError一起使用
posted @ 2021-05-13 20:50  liuqIT  阅读(170)  评论(0)    收藏  举报