java的jvm学习
java虚拟机学习、java的jvm学习
总结:类加载子系统------运行时数据区-----执行引擎
类加载子系统:
加载阶段----链接阶段----初始化阶段
加载阶段分为:引导类加载器、扩展类加载器、系统类加载器。
链接阶段分为:验证、准备、解析
初始化阶段:初始化
classloader常用方法:
双亲委派机制:
理解:用父类的引导类加载器(引导类加载器、扩展类加载器、系统类加载器),一直往上找,找到就用父类的,找不到用子类的加载器.
数据运行时数据区:
程序计数器、堆,方法区(java8之后叫元空间)、虚拟机栈、本地方法栈
pc寄存器
栈是运行时的单位,堆是存储的单位
java虚拟机栈:
栈帧、一个栈帧对应一个方法。
一个线程对应一个虚拟机栈----栈帧(局部变量表、操作数栈、动态链接、返回)
对于栈来说不存在垃圾回收、存在oom
设置栈大小:-Xss
局部变量表:一个数组,报错局部变量和对象的引用。
栈帧:局部变量表、操作数栈、动态链接、方法出口。
本地方法接口、本地方法栈
堆学习
堆大小设置:-Xmx512m -Xms512m
java8堆的变化:永久代变成了元空间
查看堆使用情况
jps---jstat -gc 9228
方式二: 通过工具查看:java vitualvm
设置新生代大小:-Xmn
java调优工具:
堆空间的tlab可以设置,线程不共享区域。
逃逸分析:对象放到栈里面,在方法内部定义对象。
方法区(元空间):
方法区在启动的时候被创建,共享的
方法区大小设置:-XX:MetaspaceSize= -XX:MaxMetaspaceSize= 默认是21m
方法区内部结构:
运行时常量池,类信息、常量、静态变量、jit代码缓存。
内存布局:
对象头:元数据(哈希值、gc、锁状态标致、mark word)
类型指针
实例数据
对齐填充
直接内存 :diretbytebuffer
执行引擎:
解释器、编译器(jit)
解释器:-xint
编译器:-Xcomp
混合模式:-Xmixed
总结:
String学习
1.8jdk:
private final char value[];
1.9jdk:
private final byte [];
intern()方法
垃圾回收:
标记阶段:引用计数算法、可达性分析算法。
清除阶段:清除算法、复制算法、整理算法。
GCroot
finalize()方法,对象回收的时候调用此方法。虚拟机对象三种状态:可触及的、可复活的、不可触及的。
使用mat查看gc roots
标记清除:
内存溢出:内存使用空间不足,即使出发了gc,空间还是不够。
内存泄露:对象不再使用,又回收不了。例子:close资源,网络io、数据库连接池。
安全点和安全区域
强引用:Object object=new Object()、new的对象。不回收。
软引用:内存不足就回收软引用的。
弱引用:进行垃圾回收就回收。发现即回收。
虚引用:
垃圾回收器:
串行回收器:单cpu上可以使用,或者是在客户端client模式使用。
并行回收器:cms、g1
GC的性能指标:吞吐量、暂停时间、内存占用
查看默认垃圾回收器: -XX:+PrintCommandLineFlage
设置垃圾回收器;-XX:+UseSerialGC
JAVA8默认垃圾回收器:
cms垃圾回收器:低延迟。
初始标记、并发标记、重新标记、并发清除。
G1垃圾回收器:
总结:
jvm调优:
先监控--在调优
jps查看正在进行的进程。
jps -l 查询详细信息
jstat 查看jvm统计信息
jstat -class 进程号
jhat
jdk自带的:jconsole、vistual vm
arthas
理解:
stringbuild一定是线程不安全的嘛?不是,从操作数栈来解释
单例模式,双重检测锁,两个地方判断是否为空,提高效率
volitaile:可见性和有序性。
为何乱序?提高效率
指令1去内存读数据,等待返回,先干别的事情。
内存屏障
锁是干嘛的?协调线程
普通对象在内存的布局:markwork、类型指针、实例数据、对齐。
cas自旋锁,乐观锁问题?aba问题,加版本号解决
锁升级
jmm模型:
volicate解决指令重排序,内存屏障。
查看堆内存大小:
java -XX:+PrintFlagsFinal -version | grep HeapSize
jstat -gc 10859
参考学习:https://www.bilibili.com/video/BV1PJ411n7xZ?p=43&spm_id_from=pageDriver
https://www.bilibili.com/video/BV1eP411C7oC?p=12&spm_id_from=pageDriver&vd_source=f97080956039c326589b5b26607d960b
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?