视频地址:
https://www.bilibili.com/video/BV1iJ411d7jS?p=2 JVM 使用C 编写的 ,所以 JAVA 也叫 C+±-
JRE = JVM +
JDK =

要学习《深入理解JVM》这本书。

P1、JVM的学习方式    10:01
P2、JVM的体系结构    11:57
P3、类加载器及双亲委派机制    31:48
P4、Java历史-沙箱安全机制    14:12
P5、Native、方法区    19:29
P6、深入理解一下栈    23:26
P7、走近HotSpot和堆    18:38
P8、新生区、永久区、堆内存调优    34:55
P9、使用JPofiler工具分析OOM原因    22:24
P10、GC介绍之引用计数法    10:08
P11、GC之复制算法    16:45
P12、GC之标记压缩清除算法    08:40
P13、GC算法总结和鸡汤    09:18
P14、如何快速学习方法讲解    20:37

P1、JVM的学习方式 10:01

P2、JVM的体系结构 11:57

java jvm实战 jvm教学视频_java jvm实战


java jvm实战 jvm教学视频_java jvm实战_02

java jvm实战 jvm教学视频_java jvm实战_03

P3、类加载器及双亲委派机制 31:48

java jvm实战 jvm教学视频_JVM_04

P4、Java历史-沙箱安全机制 14:12

java 1.0 中远程代码 无法访问本地资源

java jvm实战 jvm教学视频_JVM_05

java1.1 中增加了安全策略,允许用户指定代码对本地资源的访问权限

java jvm实战 jvm教学视频_堆内存_06

java jvm实战 jvm教学视频_堆内存_07


java jvm实战 jvm教学视频_JVM_08

P5、Native、方法区 19:29

new Thread(()->{
            System.out.println("sss");
        }).start();   //start()  方法 调用 start0()  方法就是本地方法 

public class Thread implements Runnable {
       private native void start0();   //java 类中的方法没有方法体 ,自己无法实现  
}

PC 寄存器(程序计数器) :Program Counter Register
每个线程一个,用来存储即将执行指令的地址,

方法区: static final 常量池 Class

P6、深入理解一下栈 23:26

  1. 栈:数据结构
    程序= 数据结构+算法;持续学习
    程序=框架+业务逻辑 ;吃饭 。。。 将被淘汰
  2. 栈: 先进后出,属于叫做压栈 , 可以理解为一个桶
    队列: 先进先出 , – — – – – 可以理解为一个管道
    栈:栈内存,主管程序的运行,生命周期和线程同步
    栈:8大基本数据类型+ 对象引用+示例的方法
    栈运行原理: 栈帧
    喝多了吐就是栈,吃多了拉就是队列

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

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

StackOverFlowError

java jvm实战 jvm教学视频_java_09

栈 + 堆 + 方法区的交互关系

java jvm实战 jvm教学视频_java_10

P7、走近HotSpot和堆 18:38

三种JVM
java -version
1.HotSpot ------Sun
2.BEA JRockit ----Oracle
3.J9 VM ----------IBM

我们学习的是HosSpot版本的

java jvm实战 jvm教学视频_堆内存_11

Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的 。
类加载器读取类文件后,
堆内存要细分为三个区域

新生区 Yong/New

伊甸园 Eden Space 幸存0区 幸存1区

养老区 old
永久区 Perm

GC垃圾回收,主要在伊甸园区,和养老区

如果内存满了,OOM,堆内存不够了,

在jdk1.8之后,永久存储区,叫做元空间

java jvm实战 jvm教学视频_java_12

P8、新生区、永久区、堆内存调优 34:55

java jvm实战 jvm教学视频_java_13

java jvm实战 jvm教学视频_java jvm实战_14

新生区:

类:诞生和成长的地方,甚至是死亡的地方。
伊甸园区: 所有的对象都是在伊甸园区new出来的。
幸存区(0,1)

老年区:
永久区: 此区域常驻内存,用来存放JDK自身携带的Class对象,Interface源数据,java运行时的一些环境。

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

经过研究:99%的对象都是临时对象!

java jvm实战 jvm教学视频_java_15

java jvm实战 jvm教学视频_java jvm实战_16

P9、使用JProfiler工具分析OOM原因 22:24

JProfiler:
可以分析Dump内存文件,快速定位内存泄漏
获取堆中的数据
获取大的对象

P10、GC介绍之引用计数法 10:08

GC的作用区域

JVM在进行GC时,分为轻GC,重GC

JVM堆里面的分区有哪些? Eden,from,to,老年区 ,

JVM的内存模型和分区,详细到每个分区。

java jvm实战 jvm教学视频_java jvm实战_17

P11、GC之复制算法 16:45

当一个对象经历15次对象,还没有被清理,进入老年区,

存活度较低,用复制算法

java jvm实战 jvm教学视频_java jvm实战_18

P12、GC之标记压缩清除算法 08:40

java jvm实战 jvm教学视频_JVM_19

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

标记压缩:

P13、GC算法总结和鸡汤 09:18

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

年轻代: 存活率低,复制算法;
老年代: 存活率高, 标记清除算法+ 标记清除压缩算法

P14、如何快速学习方法讲解 20:37

JMM: Java Memory Model

  1. 是什么
  2. 干嘛的?
  3. 如何学习