JVM的理解

在这里插入图片描述Java虚拟机有3种执行方式,
Xint 解释执行
Xcomp 编译执行
mixed混合执行
默认情况下处于混合模式中

在这里插入图片描述
反射 是通过实例对象找到class类信息
在这里插入图片描述在这里插入图片描述
-XX:+TraceClassLoading 追踪类的加载信息并且打印,工作中可以用来分析项目为什么启动这么慢,哪些类被加载哪些没被加载
例如 final关键字,当不加这个关键字的时候一个类调用另一个类的数据会初始化类, 而用他修饰的数据在编译的时候就会被加载到常量池里面,Demo3 执行的时候,直接调用的Demo3的常量池里数据就行了,不需要去初始化parent类,例如下图,这样就提高了性能
在这里插入图片描述类加载机制
主要是为了保护类的统一性,不然你写一个类把java原生的类覆盖,别人加载你写的类,就会出问题了 例如你把他的String重写了。。 是不是就炸了.

native 关键是:表示java的权限不够大,无法触及,需要调用C的库去实现, 一般是硬件,其他的java一般都可以自己完成了

程序计数器:每一个线程都有一个程序计数器
作用:当前字节码执行的行号指示器
在单线程里是没问题的,在多线程里是通过cpu时间片轮转来实现的,某个线程在执行的过程中可能会因为时间耗尽而挂起,当这个线程再次获得时间片时,需要从挂起的地方继续执行,这个时候就是通过程序计数器来实现的

元空间: 方法区在HotSpot JVM中的实现
使用的是本地的内存,不是jvm内存!!
方法区存放: 类信息,常量(静态和普通),字符串,静态变量,符号引用,方法代码等
元空间和永久代 是对JVM规范中方法区的实现, 规范的实现
假设元空间满了,-XX:MetasapceSize10m,
:先进后出的原则,程序进行的过程中就是压栈的过程,例如main线程下执行各种东西,通常是最后执行的先结束,所以。。
栈的数据是不能共享的,存取速度比堆快!仅次于寄存器,堆可以共享,生命周期和线程一致
栈帧:A调用B A是父帧,B是子帧 B先结束,A再结束
堆:
1.7以及1.7之前存放:类信息,方法,常量,类,之后这些在元空间
在这里插入图片描述
进入养老区的清理次数默认是15次 可以修改

永久代:放一些jdk 自身携带的class(一些启动的依赖啥的)或者inteface元数据,
当启动的时候OutOfMemory PremGen 可能是启动的时候加载了大量了第三方包,导致内存溢出OOM
因此项目里不需要的jar包尽可能移除,因为他会加大项目的体积,让永久代消耗变大

常量池的位置:
1.6 存在永久代,常量池在方法区,
1.7 尝试去处永久代,常量池在堆中,
1.8 去除永久代,换成元空间,常量池在元空间中
方法区:别名非堆

在这里插入图片描述
-XX:+PrintGCDetails; // 输出详细的垃圾回收信息
-Xmx: 最大分配内存; 1/4
-Xms: 初始分配的内存大小; 1/64
另外年轻代+养老代= JVM虚拟内存总大小

强引用时不会被gc回收,导致内存泄漏的主要原因
强引用:new XXX();
软引用:GC回收的时候,内存充足,就不会回收
弱引用: GC回收不管充不充足都会回收
应用场景:在一些可能泄漏,但又不重要的场合,可以用软引用和弱引用
虚引用:跟踪对象的垃圾回收状态,要配合队列使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值