先来一张神图
jvm运行时数据区,分为这五个部分,让我们来见识下我们的代码是如何飞奔在这几个地方的。
指令:
程序计数器:记录当前线程的起始地址和偏移量,一看就知道是为了线程挂起后,恢复上下文用的。
虚拟机栈:栈关键字,先进后出,主要包括用户存储局部变量表、操作栈、动态链接、方法出口等信息。
本地方法栈:栈关键字,jvm底层实现,native方法。
数据
方法区:
线程共享
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
heap:堆
线程共享
存储引用对象真实分配的空间,我们说的垃圾回收就是处理这一块。
堆分为新生代(分为伊甸园和两个存活区)、老生代、永久代(对于hotspot来说,jdk1.7之前都使用永久代来实现方法区,方 法区不等于永久代,永久代只是方法区的一个实现,不同的虚拟机实现方法区有不同的机制。jdk1.8之后没有永久代了)
了解堆内存模型,接下来肯定要讲讲垃圾回收算法
常用算法:引用计数法:标记清除法、标记压缩法、复制清除法、分带算法。
主要方法论,GcRoot可达算法。
垃圾回收器:算法的实现
1、Serial (Serial Old) 收集器:
serial:复制清除算法
Serial Old: 是单线程收集器,采用标记-整理算法。
2、CMS收集器--低延迟为先(并发的收集器)
标记清除算法,这样并发,清除最快。
3 ParNew收集器
复制清除算法
4 、Parallel Scavenge (Parallel Old)收集器--吞吐量为先!
新生代复制清除算法,老年代标记-压缩算法
感谢下列blog,我主要是记录下自己的收获,具体请参考大牛blog:
https://blog.csdn.net/weixin_30917213/article/details/98988280