JVM基础版

JVM

JVM特特特特别基础,有些概念,专有名词是JDK8前后的混用,后面再重新发一篇笔记

  • 谈谈对JVM的理解,java8虚拟机和之前的变化更新
  • 什么是OOM,什么是栈溢出StackOverFlowError,怎么分析
  • JVM的常用调优参数有哪些
  • 内存快照如何抓取,怎么分析Dump文件
  • JVM中,类加载器的认识

1、JVM的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B35YyDIR-1603976197381)(E:\桌面\images\1603524327(1)].png)

2、JVM的体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QWhwpzQS-1603976197384)(E:\桌面\images\1603527011(1)].png)

3、类加载器

作用:加载Class文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lvtiJeEg-1603976197386)(E:\桌面\images\1603606193(1)].png)

4、双亲委派机制

APP – > EXC --> BOOT(最终执行)

  1. 类加载器收到类加载的请求
  2. 将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
  3. 启动加载器检查是否能加载8当前这个类,能加载就结束,使用当前的加载器,否则,通知子加载器进行加载
  4. 重复步骤3

5、native

native

private native void start0();

  • 凡事带了native关键字的,说明java的作用范围达不到了,回去调用底层c语言的库

  • 会进入本地方法栈

  • 调用本地方法接口 JNI

  • JNI作用:扩展java的使用,融合不同的编程语言为java所用

  • 在内存区域中专门开辟; 一块标记区域:Native Method Stack ,登记Native方法

  • 在最终执行的时候,加载本地方法库中的方法

6、方法区

Method Area

​ 方法区(永久代)是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单来说,所有定义的方法的信息都保存在该区域,此区域属于共享区域

静态变量,常量,类信息(构造方法,接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,与方法区无关

static ,final , Class模板 ,常量池( java6及之前,7开始放在堆)

7、栈

先进后出,后进先出

8大基本类型+对象引用+实例的方法

运行原理:栈帧

8、堆

  • Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的

  • 类加载器读取了类文件后,一般会把什么东西放到堆中?类,常量,方法,变量,常量池,保存我们所有引用类型的真实对象

  • 堆内存中还要细分为三个区域

    • 新生代 Young/New
    • 老年代 Tenured
    • 永久代 perm(1.7前,18开始为元空间–不在虚拟机中,使用本地内存 )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSQuL7zj-1603976197390)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201025231709604.png)]

新生代

  • 类:诞生和成长的地方,甚至死亡

  • 伊甸园 所有对象都是伊甸园区new 出来的

  • 幸存者区(0,1)

永久代

这个区域常驻内存的。用来存放JDK自身携带的Class对象,Interface元数据,存储的是java运行时的一些环境或类信息,这个区域不存在垃圾回收。关闭vm虚拟就会释放这个区域的内存

一个启动类,加载了大量第三方jar包。tomcat部署了太多应用,大量动态生成的反射类。不断的被加载,直到内存满,就会出现OOM

  • jdk1.6之前:永久代,常量池是在方法区
  • jdk1.7 :永久代,但是慢慢退化,去永久代,常量池在堆中
  • jdk1.8之后 :无永久代,常量池在元空间

9、分析OOM

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WtjcLplU-1603976197393)(E:\桌面\images\1603697385(1)].png)

10、GC

算法

标记清除法,标记压缩,复制算法,(引用计数器)

复制算法

  • 幸存区to、from 会交换,谁空谁是to

  • 每次GC都会讲Eden火的对象移到幸存区:一旦Eden区被GC后,就会是空的

  • 当一个对象经历了15次GC,都还没有死,就会进入老年代

  • 通过这个参数设定进入老年代的时间

    • -XX:MaxTenuringThreshold= n n-几次

好处:没有内存的碎片

坏处:浪费了内存空间,多了一半空间永远是空to。

复制算法最佳使用场景:对象存货度较低的时候

标记清除算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UWbXZ3m-1603976197394)(E:\桌面\images\1603701172(1)].png)

  • 优点:不需要额外的空间
  • 缺点:两次扫描,严重浪费时间,会产生内存碎片

标记压缩

再优化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56WEXUpE-1603976197395)(E:\桌面\images\1603701447(1)].jpg)

标志清除压缩

先标志清除几次,再进行压缩

11、总结

内存效率:复制算法>标志清除算法>标志压缩算法(时间复杂度)

内存整齐度:制算法=标志压缩算法>标记清除算法

内存利用率:标志清除算法=标志压缩算法>复制算法

新生代

  • 存活率低
  • 复制算法

老年代

  • 区域大,存活率
  • 标志清除(内存碎片不是太多)+标记压缩混合实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值