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

栈:先进后出、后进先出

在这里插入图片描述

队列:先进先出(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);

}

}

通过查看线程发现,第24行代码发现问题

在这里插入图片描述

生成dump文件之后会产生 java_pid21756.hprof.analysis 文件夹,可以将其删除

在这里插入图片描述


14.堆内存调优


没有


15.GC :垃圾回收机制


垃圾回收的区域只有在堆里面(方法区在堆里面)

在这里插入图片描述

15.1垃圾回收 = GC

JVM 在进行垃圾回收(GC)时,并不是堆这三个区域统一回收。大部分时候,回收都是新生代~

1.新生代

2.幸存区(form,to)

3.老年区

GC 两种类:轻GC(普通GC),重GC (全局GC)

轻GC 指针对 新生代 和 偶尔走一下 幸存区。

重GC 全部清完。

题目:

1.JVM的内存模型和分区~详细到每一个区放什么?

2.堆里面的分区有哪些?

3.GC的算法有哪些?

标记清除法

标记整理

复制算法

引用计数法

怎么用的?

4.轻GC 和 重GC 分别再什么时候发生?

引用计数法

假设我对象A 用了 一次就给它加上1

假设我对象B 用了 两次就给它加上2

假设我对象C 没有使用 就是 0

引用计数法就是给每个对象分配一个计数器

假设C 对象为 0,它就要被清除出去了

JVM 现在一般不采用这种方式,不高效。

在这里插入图片描述

在这里插入图片描述


15.2复制算法

每次GC 都会将 伊甸园区 活得对象 移动到 幸存区 中,如果幸存区放不下 ,就移到养老区中。

一旦伊甸园区被GC 后,就会是空的。

当某对象从伊甸园区 存活下来了。

谁空谁是to

假设这个对象还活着,它就把这个对象复制到另一个区域 要么是 form 要么是 to

当某个对象 经历15次(默认值)GC 都还没有死的时候,就会进入养老区。

在这里插入图片描述


15.3图解复制算法

假设 幸存区里面,to 是空的,form 里面有对象。

在这里插入图片描述

现在要做一次垃圾回收了

首先:伊甸园区 存活的对象往 to 里面走

在这里插入图片描述

其次,form 区里面的 对象也要往 to 里面走

每次清理完之后,伊甸园区是空的,to区是空的。

在这里插入图片描述

在这里插入图片描述

经历15次GC之后,会把幸存区 里面或者的对象 移到养老区

在这里插入图片描述

好处:没有内存的碎片

坏事:浪费一半内存的空间:多了一半空间用于是空的。

赋值算法最佳使用场景:对象存活度较低的时候;新生区


15.4标记清除算法

扫描这些对象,对活着的对象进行标记

清除:对没有标记的对象,进行清除

在这里插入图片描述

优点:不需要额外的空间

缺点:两次扫描严重浪费时间,会产生内存碎片。


15.5标记压缩

在这里插入图片描述


15.6总结:

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

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

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

没有最优算法吗?

没有;

没有最好的算法,只有最合适的算法~ ---->GC: 分代收集算法

每一代用合适的算法就好了。

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:

目录:

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

rk,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDI1Nzk4,size_16,color_FFFFFF,t_70#pic_center)


15.6总结:

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

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

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

没有最优算法吗?

没有;

没有最好的算法,只有最合适的算法~ ---->GC: 分代收集算法

每一代用合适的算法就好了。

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:

目录:

[外链图片转存中…(img-98c11Cco-1714279232765)]

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

[外链图片转存中…(img-COmIaLfE-1714279232766)]

Java面试核心知识点

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值