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

posted @   刘百会  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示