0
点赞
收藏
分享

微信扫一扫

华为设备核查命令下

干自闭 2024-07-29 阅读 6
jvm

目录

JVM是什么

Java虚拟机(Java Virtual Machine),用来运行.class的字节码文件。

运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。如果程序书写不当会出现OutOfMemory Error内存溢出

线程私有

1.程序计数器

2.虚拟机栈

存放的元素是栈帧
栈帧:每个方法被执行的时候Java虚拟机会创造一个栈帧,用于存放局部变量表、动态连接、方法出口等信息。每个方法的调用过程,就是栈帧从入栈到出栈的过程。

局部变量表:存储程序编译的时候的基本数据类型,和对象引用,内部以 局部变量槽(Slot) 作为存储单位,64位长度的数据类型会占用两个变量槽的方式,其余数据类型均只占用一个 局部变量槽

3.本地方法栈

什么是本地方法?

线程共享

1.方法区

实现: 一般处于堆中的永久代

目的: 已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

元空间:位置在本地内存,jdk8以后把方法区中的信息全部转移到了元空间

2.堆

目的:用于存放对象实例

TLAB:(Thread Local Allocation Buffer):在堆中给每个线程一块属于自己的空间用于分配

二、对象创建

1.给对象分配空间

(1)指针碰撞

什么是指针碰撞?

什么情况下使用指针碰撞?

(2)空闲列表

什么时候使用空闲列表

什么是空闲列表?

2.对象的内存布局

对象的组成

首先对象头由:Mark Word和类型指针(指向对象类信息的一个指针)组成,如果对象是数组,那么对象头中还有一部分用来存放数组长度的区域。

Mark Word

**什么是Mark Word **
Mark Word是一个有着动态定义的数据结构,是用于存储对象自身的运行时数据,如哈 希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等

例如
Mark Word的32个比特存储空间中的25个比特用于存储对象哈希码,4个比特用于存储对象分代年
龄,2个比特用于存储锁标志位,1个比特固定为0
在这里插入图片描述

如下:
Alt

类型指针

是一个指向对象所在类的指针

实例数据:

对齐填充

对象的访问定位

句柄法

句柄池:在java堆中划分出一部分
句柄法:Java栈本地变量表中的reference-----》句柄池------》方法区中的创建对象的类/对象实例数据
在这里插入图片描述

直接指针:Java栈本地变量表中的reference指向对象实例数据指向方法区中的创建对象的类
在这里插入图片描述

优点:访问少一次指针定位
缺点:如果很多reference都指向了一个对象实例,那么要更改对象实例的地址的时候,需要更改很多个reference

三、垃圾收集器和内存分配策略

1.那些内存需要回收?

2.什么时候回收

《1》怎么判断对象死没死?

(1) 引用计数法,我称其为(脑门刻字法)
(2) 可达性分析算法,我称其为(平地长树法)

可以被认为是GC Roots的对象

项目例子
·在虚拟机栈(栈帧中的本地变量表)中引用的对象譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。
·在方法区中类静态属性引用的对象譬如Java类的引用类型静态变量。
·在方法区中常量引用的对象譬如字符串常量池(String Table)里的引用。
·在本地方法栈中JNI(即通常所说的Native方法)引用的对象。
·Java虚拟机内部的引用如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。
·所有被同步锁(synchronized关键字)持有的对象。
·反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

《2》再谈引用

强引用
软引用

例子

SoftReference<String> sr = new SoftReference<String>(new String("hello"));
System.out.println(sr.get());
弱引用

例子

	WeakReference<String> sr = new WeakReference<String>(new String("hello"));
    System.out.println(sr.get());
    System.gc();                //通知JVM的gc进行垃圾回收
    System.out.println(sr.get());
虚引用

3.如何回收

垃圾收集理论基础

垃圾收集算法

标记-清除
标记-复制

算法描述

Alt
标记-复制算法的改进

标记-整理

在这里插入图片描述

经典的垃圾收集器

CMS收集器(Concurrent Mark Sweep)
步骤

由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

G1收集器

**实现方式:**收集器面向局部收集的设计思路和基于Region的内存布局形式。
主要面向服务端应用的垃圾收集器。
面向局部收集
基于Region
通过原始快照(SATB)算法来实现的

步骤
举报

相关推荐

0 条评论