1、先看看有关jvm的几张描述图
上面是我看了很多篇博客盗来的两张图(参考的博客后面贴,不一定全),先从这两张图开始说这5个JVM区域。
第一张描述线程对于运行中的JVM操作区域:
1、共用的区域:方法区和堆、线程共享区域随虚拟机的启动而创建,随着虚拟机的关闭而销毁。
2、线程私有的区域:虚拟机栈。程序计数器和本地方法区,线程私有区域是随着线程的启动而创建,随着线程结束而销毁。
第二张是描述这几个区域的内存分布。白绿颜色也是有对第一张图的小说明。
1、jvm的内存:堆、虚拟机栈、程序计数器和本地方法区。
2、电脑本机内存:元数据区。
等等为什么方法区不见 ,很多文章关于JVM内存结构的说法模糊不清大概数1.8JVM结构变化,即元空间(元数据区)代替了永久代(方法区)。
摘抄一下比较合理理解:“很多文章里喜欢把方法区等同与永久代,永久代既然没了,方法区也就没了。但我认为方法区只是一种逻辑上的概念,永久代指物理上的堆内存的一块空间,这块实际的空间完成了方法区存储字节码、静态变量、常量的功能等等。既然如此,现在元空间也可以认为是新的方法区的实现了”。 既然换了个名称也换了个实现方式,那么其主要区别就可以总结为三点:
1、内存存储位置的变化,原本在jvm内存的区域搬到了操作系统本地内存
2、存储东西的变化,原来存放在方法区中的东西,一部分存在了堆中,另一部分则存在了元空间中。(即下图-来源于网络)
2、jvm运行后,有关垃圾回收情况
有了jvm的5个区域理念,现在加上运行过程,可以整合上面大致关系图。在运行时,堆内存用创建实例来满足线程使用来完成一段段的代码逻辑,创建的实例有这种spring创建的实例 ,也有我们手动new 的对象。当对象太多,就得清除一些不使用的对象,来收复一些被占用的内存空间。
被垃圾回收的地方主要是堆这个地方,堆分为新生代(1/3堆空间)和老年代(2/3堆空间),新生代里面又分为eden(8/10新生代)、ervivorFrom(1/10新生代,描述为S0)和servivorTo(1/10新生代,描述为S1),著名的 8:1:1。
垃圾回收涉及这几个过程:
1、如何确定垃圾
2、常用的垃圾回收算法
3、垃圾收集器
这些东西都有描述和配置方式,在参考文档中说明。
现在只说明 1、新生代与复制算法 2、老年代与标记算法。
1、新生代与复制算法
(1)对象首先生产在eden中
(2)eden满了执行一次minorGc,也叫YGC,把还被引用的对象放到S0,被放入的对象年龄标记 +1,清空eden。
(3)一段时间后eden又满了,1、把S0复制到S1 对象年龄标记 +1,2、eden还被引用的对象放入到S1 对象年龄标记 +1 ,3、清空eden和S0。
往后的操作都是第三步,不过是S0和S1之间的相互复制和eden放入清空。如果相互复制的对象的标记到了15,则把该对象放到老年代。
2、老年代与标记整理算法
进入老年代的对象,要么是对象太大,直接放进来(可配置大小),因为太大的对象在S0和S1相互复制也挺浪费的,还不如直接放入老年代;另一种就是 对象年龄标记到了15(比如 -XX:MaxTenuringThreshold=15 默认也是15次)。
老年代满了,执行gc是 fullGC,直接释放死亡状态的对象所占用的内存空间,至于标记整理算法其主要功能是清除碎片。
下面是的两张总结图(来源网上)。
自己整合的运行图,如果有好建议和意见请告诉我,把图画好是个很好的记忆节点。
https://www.processon.com/view/link/5ec8b2f8f346fb6907112565
密码:22f9
参考:
jvm内存模型和java内存模型
https://blog.csdn.net/weixin_40321672/article/details/84778940
//jdk1.8——jvm分析与调优
https://www.jianshu.com/p/30e8ff0f7dd9
//带GC4中算法讲解
https://blog.csdn.net/qq_35730039/article/details/80736316
//1.7 jvm参数设置的讲解
https://www.jianshu.com/p/b072ecc239f5
//JVM中常量池存放位置
https://blog.csdn.net/qq_42629806/article/details/99842776
//jvm8内存模型和内存分配
https://www.cnblogs.com/chengyangyang/p/10837996.html
//JDK8的JVM内存结构,元空间替代永久代成为方法区及常量池的变化
https://www.cnblogs.com/shen-qian/p/11277085.html
//比较全面的资料
https://github.com/doocs/jvm/blob/master/README.md
//频繁ygc
https://blog.csdn.net/wwd0501/article/details/91535546
//JVM(五) 生产环境内存溢出调优
http://www.bubuko.com/infodetail-3322192.html