JVM复习

目录

一、JVM的执行流程

数据区:

1、堆(线程共享)

在代码中使用new创建出来的对象都存在堆区

JVM中内存使用最大的一个内存区域,默认程序最大的运行内存是本机的1/8

设置参数:启动时的最小内存:-Xms10m 运行时最大限制:-Xmx10m

2、Java虚拟机栈(线程私有)

Java虚拟机栈的生命周期和线程相同

每创建一个线程都会在内存中创建一个与之对应的Java虚拟机栈

因为线程与线程之间的工作内存是隔离的,所以Java虚拟机栈是线程私有的

图片中栈对应线程,调用新方法进行压栈,方法执行完了就出栈,栈空了之后也就意味着线程结束了。

3、本地方法栈(线程私有)

调用本地方法时,使用的栈。

4、程序计数器(线程私有)

与线程有对应关系

记录当前线程执行到哪一行,下次回到CPU的时候从计数器位置开始执行

5、方法区(线程共享)

保存的就是类对象(new对象的模板)

方法区是JVM中的规范

JDK7的实现中称为永久代

JDK8的实现中称为元空间

JDK7和JDK8区别在于管理内存的方式不同

因为存放的是公共的数据,所以所有的线程都可以访问这个区域

二、垃圾回收(GC)

相关知识

垃圾:不再使用的对象,可以被回收的对象

回收的时对象占用的内存空间,主要说的堆内存,栈内存是随着线程的销毁而销毁

如何标识一个对象是否死亡

1、引用计数法(JVM并未采用引用计数法,正是因为无法解决循环引用问题)

对于图片中,堆中的new Test()对应的内存空间永远也回收不了,会导致内存泄漏

2、可达性分析算法(这是 JVM实际使用的对象死亡判定算法)

垃圾回收算法

1、标记-清除算法(这是 CMS 收集器的核心算法)

会产生空间问题:会产生大量不连续的内存碎片,如果有一个大对象将会没有足够的空间------>再次触发垃圾回收GC------>会停止所有的用户线程(stop the world = STW)------>无法控制

2、复制算法(这是新生代的主流算法)

1、把内存区域1中的存活的对象,复制到内存区域2中

2、在内存区域2中,把对象按内存地址顺序排好,相当于对内存进行了整理

3、把内存区域1的空间全部清空

4、每次回收都重复上述操作

空间问题:只有一半的内存空间可以使用,利用率不高

程序运行的时候只使用其中一个区域,另一个区域是空闲的

3、标记-整理法(这是老年代的主流算法)

每次回收完一块内存之后就把存活的对象向一端整理

在移动对象的过程中,效率会受到很大的影响

真正使用的

新生代使用的是复制算法,老年代使用的是标记-整理法

具体的垃圾回收过程,去看面试题里面的总结。

G1 收集器打破了严格的分代界限,采用 Region 划分,但依然遵循 "新生代用复制、老年代用标记 - 整理" 的算法思想。

相关推荐
晒太羊的猫11 小时前
jvm面试题
jvm
夜之眷属15 小时前
Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场
java·运维·服务器·jvm
用户0942485680316 小时前
第31章:JVM字节码解释器与模板解释器源码路径
java·jvm
阿俊-全栈开发18 小时前
LikeShop 版本升级与备份:从旧版平滑迁移的完整步骤
jvm·数据库·oracle·开源·likeshop·likeshop开源商城
Nebula_g20 小时前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈
JAVA面经实录91720 小时前
Java高级后端 · 全套面试通关手册(线上故障排查)
java·jvm·面试
sibylyue1 天前
SQLite 运行模式
java·jvm·sqlite
toooooop81 天前
宝塔Python项目管理器:环境变量踩坑记录
java·jvm·python
佳児素花痴╮2 天前
线程知识点
java·开发语言·jvm
用户094248568032 天前
第29章:【OpenJDK中级篇综合实战】百万长连接网关的JVM稳定性工程
java·jvm