JVM
2023-09-13 16:02:55 1 举报
AI智能生成
Java虚拟机(JVM)是Java技术的核心,它是一个虚拟的计算机,具有处理器、堆栈、寄存器等组件。JVM的主要任务是加载、验证和执行Java字节码文件,确保在不同平台上运行的Java程序具有一致的行为和性能。JVM还负责内存管理、垃圾回收和安全性控制等功能。通过JVM,Java程序员可以编写一次代码,然后在不同的操作系统和硬件平台上运行,而无需关心底层的具体实现。这种跨平台的特性使得Java成为企业级应用开发的首选语言。
作者其他创作
大纲/内容
概述
定义:Java Virtual Machine -java程序的运行环境(Java二进制字节码的运行环境)
好处 :
一次编写到处运行
自动内存管理,垃圾回收功能
数组下标越界检查
比较:
JDK
JVM+基础类库 +编译工具
JRE
JVM+基础类库
JVM
内存结构
程序计数器
当前线程所执行字节码的行号指示器
虚拟机栈
用于存储局部变量表,操作数栈,动态链接,方法出口等
本地方法栈
用于存储native方法栈针
堆
用于存放对象实例
方法区
用于存储被加载的类信息、常量、静态变量、编译后的代码等
运行时常量池
方法区中一部分,用于存放class编译后产生的各种字面量与符号引用
直接内存
用于NIO操作,直接使用本机内存
对象
对象的创建
类加载检查
类加载
分配内存
指针碰撞:Java堆内存规整,通过将指针向空闲部分压缩需要分配的内存大小
空闲列表:堆内存不规整,从列表找一块足够大的内存分配给对象实例并更新列表记录
对象的内存布局
对象头
运行时数据:hash码、GC分代年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳
类元数据的指针和数组长度
实例数据
程序代码中所定义的各种类型的字段内容
对齐填充
对象的大小必须是8字节的整数倍,所以有时需要填充对齐
对象的访问
通过句柄访问对象需要在堆中分配句柄池内存,栈中只用存句柄池的地址
通过直接指针访问对象,堆对象中需要存放对象类型数据地址
内存溢出
Java堆溢出
异常信息:java.lang.OutOfMemoryError: Java heap space
栈溢出
GC
判断对象是否存活
引用计数法
给对象添加一个引用计数器,每当有一个地方引用它时就加1,当引用失效时就减1,若为0了则表示对象不可能再被使用(存在循环引用问题)
可达性法
通过系列称为“GC Roots”的对象作为起始点,从这个起点向下搜索,搜索走过的所有路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,就表示这个对象不可用。
GC Roots对象
虚拟机栈中引用对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法中的JNI引用的对象
引用
强引用
只要引用还存在,垃圾收集器永远都不会回收被引用的对象
软引用
即将抛出内存溢出异常时,将软引用对象列入回收列表,进行第二次回收
弱引用
当垃圾回收时,不管内存是否够用,都会将其回收
虚引用
完全不影响对象的生命,虚引用的目的只是为了在垃圾回收时得到通知
垃圾回收算法
标记清除算法
原理同上引用计数法,缺点:产生大量不连续内存空间
复制算法
初始方案:将内存按容量划分为大小相等的两块,每次使用其中的一块。当这一块内存用完了,就将还存活的对象一起复制到另外一块内存中,并将这一块内存清空。
实际方案:新生代将内存空间分为一块Eden空间和两块survivor空间(Hotspot8:1:1)。每次使用Eden和其中一块survivor空间,当回收时,将还存活的对象一起复制到另外一块survivor空间去,然后清调Eden和刚使用过的survivor空间。如果另外一块survivor空间不够,则将存活对象移到老年代。
标记整理算法
原理与标记清除算法相同,不同点在于不是直接对可回收对象进行清理,而是先将存活对象都向一端移动,然后直接清理掉端边界之外的内存。
分代收集算法
上面算法的一个灵活方案:Java堆将对象分为新生代和老年代,新生代使用复制算法,老年代使用标记清除或整理算法
垃圾收集器
Serial收集器
特性:最基础、历史最悠久的收集器,是一个单线程工作的收集器,会出现Stop the world
原理:在新生代暂停所有线程采用复制算法清理垃圾,在老年代暂停所有线程采用标记整理算法清理垃圾
使用场景:对于运行在客户端模式下的虚拟机来说是一个很好的选择
ParNew收集器
特性:上是Serial收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之 外,其余的行为与Serial收集器几乎一样
原理:在Serial基础上使用多线程进行垃圾回收
使用场景:与Serial或CMS收集器配合使用
Parallel Scavenge收集器
特性:它的关注点与其他收集器不同、是达到一个可控制的吞吐 量(Throughput)
原理:基于标记-复制算法实现的收集器
使用场景:把内存管理的调优任务交给虚拟机去完成
Serial Old收集器
特性:是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法
原理:使用标记-整理算法
使用场景:供客户端模式下的HotSpot虚拟机使用,另外一种就是作为CMS 收集器发生失败时的后备预案
Parallel Old收集器
特性:是Parallel Scavenge收集器的老年代版本支持多线程并发收集
原理:基于标记-整理算法实 现
使用场景:在注重 吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器这个组 合
监控工具
jps:虚拟机进程状况工具
jps [ options ] [ hostid ]
jstat:虚拟机统计信息监视工具
jstat [ option vmid [interval[s|ms] [count]] ]
参数interval和count代表查询间隔和次数,如果省略这2个参数,说明只查询一次。假设需要每250 毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:jstat -gc 2764 250 20
参数interval和count代表查询间隔和次数,如果省略这2个参数,说明只查询一次。假设需要每250 毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:jstat -gc 2764 250 20
jinfo:Java配置信息工具
jinfo [ option ] pid
jmap:Java内存映像工具
jmap [ option ] vmid
jhat:虚拟机堆转储快照分析工具
jstack:Java堆栈跟踪工具
jstack [ option ] vmid
0 条评论
下一页