B站【狂神说Java笔记】-JVM快速入门篇

    • JVM 常问面试题
  • 1.JVM的位置

  • 2.JVM的体系结构

  • 3.类加载器

  • 4.双亲委派机制

  • 5.沙箱安全机制

  • 6.Native

  • 7.PC寄存器

  • 8.方法区

  • 9.栈

  • 10.三种JVM

  • 11.堆

  • 12.新生区、老年区

  • 13.永久区

  • 14.堆内存调优

  • 15.GC :垃圾回收机制

    • 15.1**垃圾回收 = GC**
  • 15.2**复制算法**

  • 15.3**图解复制算法**

  • 15.4**标记清除算法**

  • 15.5**标记压缩**

  • 15.6**总结:**

狂神视频地址

=====================================================================

https://www.bilibili.com/video/BV1iJ411d7jS


JVM 常问面试题


请你谈谈你对JVM的理解? java—>class---->

Java8虚拟机和之前的变化更新?

什么是OOM 内存溢出

什么栈溢出StackOverFlowError? 怎么分析

JVM 的常用调优参数?

内存快照如何抓取,怎么分析Dump文件?知道吗

谈谈JVM中,类加载器你的认识?


1.JVM的位置


在这里插入图片描述

在这里插入图片描述

JVM 调优百分之99都是在堆里面调优,方法区是特殊的堆。

在这里插入图片描述


2.JVM的体系结构


在这里插入图片描述


3.类加载器


作用:加载Class 文件,~ new Student();

类似模板,是抽象的

对象是实现,是具体的

  1. 虚拟机自带的加载器

  2. 启动类(根)加载器

  3. 扩展类加载器

  4. 应用程序加载器

在这里插入图片描述

只有一个模板

在这里插入图片描述

4.双亲委派机制


第一步:类加载器收到类加载的请求

第二步:将这个请求向上委托给父类加载器去完成 ,一直向上委托,直到启动类加载器(Boot)

第三步:启动类加载器检查是否能够加载当前和这个类 ,能加载就结束,使用当前的加载器,否则,抛出异常,通知子加载器进行加载。

第四步:重复 第三步 步骤。

null : java调用不到 ~C 、C++

Java = C++ : 去掉繁琐的东西,指针,内存管理。

Java = C+±-

双亲委派机制推荐阅读这篇文章

https://blog.csdn.net/codeyanbao/article/details/82875064


5.沙箱安全机制


没什么东西


6.Native


凡是带了native 关键字的,说明java 的作用范围达不到了,会去调用底层C 语言的库。

凡是带了native 关键字的,会进入本地方法栈。

调用本地接口:JNI

JNI作用:扩展Java的使用,融合不同的编程语言为Java 所用!最初C、C++

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

在最终执行的时候去加载本地方法库的方法,通过JNI

本地方法接口(JNI)Java Native Interface

本地方法库

private native void start0();

在这里插入图片描述

调用其他接口:Scoket 、WebService~http


7.PC寄存器


程序计数器:Program Counter Register

每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向一条指令的地址,也即将要执行的指令代码),在执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计。


8.方法区


Method Area 方法区

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

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

方法区里面存以下内容

1.static

2.final

3.Class 类模板

4.常量池

类加载过程(面试)

  1. new 一个类的时候,先在方法区有一个类的模板

  2. 类模板完了 ,方法区还有个常量池

  3. 引用在栈内存

  4. 真实的 对象在堆内存

  5. 引用指向堆内存真实的地址


9.栈


数据结构

程序 = 数据结构 +算法 : 持续学习~

程序 = 框架 + 业务逻辑 : 吃饭

栈:先进后出、后进先出

在这里插入图片描述

队列:先进先出(FIFO:First Input First Output)

在这里插入图片描述

喝多了吐就是栈,吃多了拉就是队列

为什么main 方法 先执行,最后结束!

栈:栈内存,主管程序的运行,生命周期与线程同步;

线程结束,栈内存也就释放,对于栈来说,不存在垃圾回收问题

一旦线程结束,栈就over了

栈:8大基本类型+对象引用

栈运行原理:栈帧

程序正在执行的方法,一定在栈的顶部

在这里插入图片描述

栈 + 堆 + 方法区:的一些交互关系

在这里插入图片描述


10.三种JVM


  1. Sun公司 HostSpot Java HotSpot™ 64-Bit Server VM (build 25.101-b13, mixed mode)

  2. BEA Jrockit

  3. IBM J9 VM


11.堆


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

类加载器读取了类文件后,一般会把什么东西放到堆中?

类的实例、方法、常量、变量~,保存我们所有引用类型的真实对象

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

  1. 新生区 (伊甸园区) Young/New

  2. 养老区 old

  3. 永久区 Perm

在这里插入图片描述

1.GC 垃圾回收主要是在伊甸园区和养老区~

2.假设内存满了,OOM ,堆内存不够!

3.在JDK 8以后,永久存储区改了个名字(元空间)


12.新生区、老年区


类:诞生 和 成长的地方、甚至死亡。

伊甸园区,所有的的对象都是在伊甸园区new 出来的!

幸存者区(0,1)

假设我的伊甸园区只能存储10个对象,当伊甸园区满了,就会触发一次轻GC。

在这里插入图片描述

这次gc有以下情况:

有的对象可以还被引用,就幸存下来了。

有的对象没有被引用了,就死了、没了。

幸存的下来的对象就移动到伊甸园区。

当伊甸园区和性幸存区都满了,就会触发一次重GC。

重gc 清理一次后,能活下来的对象就进入养老区了。

(就跟一场战争一样,不断的活下来)

真理:经过研究,99%的对象都是临时对象! new

13.永久区


1.jdk 1.6之前:永久代,常量池是在方法区中

2.jdk 1.7 :永久代, 但是慢慢的退化了,去 永久代,常量池在堆中

3.jdk 1.8 之后:无永久代,常量池在元空间

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

OOM出现条件:一个启动器,加载了大量的第三方jar包、Tomcat部署了太多应用,大量动态生成的反射类,直到内存满。

在这里插入图片描述

逻辑上存在,物理上不存在。

在一个项目中,突然出现OOM 故障,那么该如何排除研究为什么出错~

1.能够看到代码第几行出错:内存快照分析工具,Eclipse MAT,Jprofiler

2.Dubug,一行行分析代码~

MAT,Jprofiler作用:

1.分析Dump内存文件,快速定位内存泄漏;

2.获得堆中的数据

3.获得大的对象~

idea 安装Jprofiler

在这里插入图片描述

安装之后配置

在这里插入图片描述

在这里插入图片描述

idea 配置vm 参数

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

windows 客户端安装

在这里插入图片描述

https://www.ej-technologies.com/download/jprofiler/files

Dump 内存文件分析

在这里插入图片描述

分析:

一眼就可以看成ArrayList 出现问题了

在这里插入图片描述

错误代码如下

byte[] array = new byte[110241024];//1mb

public static void main(String[] args) {

List list = new ArrayList<>();

int count = 0;

try {

while (true){

list.add(new P1());

count++;

}

}catch (Throwable e){

e.printStackTrace();

System.out.println(“count===”+count);

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
e.printStackTrace();

System.out.println(“count===”+count);

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-DQao3qfP-1715282350633)]

[外链图片转存中…(img-hmBnrEmn-1715282350633)]

[外链图片转存中…(img-w4bx3CdB-1715282350633)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值