1、先看看有关jvm的几张描述图

看图分解JVM

 

看图分解JVM

 

    上面是我看了很多篇博客盗来的两张图(参考的博客后面贴,不一定全),先从这两张图开始说这5个JVM区域。

    第一张描述线程对于运行中的JVM操作区域:

          1、共用的区域:方法区和堆、线程共享区域随虚拟机的启动而创建,随着虚拟机的关闭而销毁。

          2、线程私有的区域:虚拟机栈。程序计数器和本地方法区,线程私有区域是随着线程的启动而创建,随着线程结束而销毁。

    第二张是描述这几个区域的内存分布。白绿颜色也是有对第一张图的小说明。

         1、jvm的内存:堆、虚拟机栈、程序计数器和本地方法区。

         2、电脑本机内存:元数据区。

         等等为什么方法区不见 ,很多文章关于JVM内存结构的说法模糊不清大概数1.8JVM结构变化,即元空间(元数据区)代替了永久代(方法区)

摘抄一下比较合理理解:“很多文章里喜欢把方法区等同与永久代,永久代既然没了,方法区也就没了。但我认为方法区只是一种逻辑上的概念,永久代指物理上的堆内存的一块空间,这块实际的空间完成了方法区存储字节码、静态变量、常量的功能等等。既然如此,现在元空间也可以认为是新的方法区的实现了”。 既然换了个名称也换了个实现方式,那么其主要区别就可以总结为三点:

1、内存存储位置的变化,原本在jvm内存的区域搬到了操作系统本地内存

2、存储东西的变化,原来存放在方法区中的东西,一部分存在了堆中,另一部分则存在了元空间中。(即下图-来源于网络)

看图分解JVM

 

2、jvm运行后,有关垃圾回收情况

看图分解JVM

        有了jvm的5个区域理念,现在加上运行过程,可以整合上面大致关系图。在运行时,堆内存用创建实例来满足线程使用来完成一段段的代码逻辑,创建的实例有这种spring创建的实例 ,也有我们手动new 的对象。当对象太多,就得清除一些不使用的对象,来收复一些被占用的内存空间。

被垃圾回收的地方主要是堆这个地方,堆分为新生代(1/3堆空间)和老年代(2/3堆空间),新生代里面又分为eden(8/10新生代)、ervivorFrom(1/10新生代,描述为S0)和servivorTo(1/10新生代,描述为S1),著名的 8:1:1。

          看图分解JVM

      垃圾回收涉及这几个过程: 

      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,直接释放死亡状态的对象所占用的内存空间,至于标记整理算法其主要功能是清除碎片。

下面是的两张总结图(来源网上)。

看图分解JVM

看图分解JVM

 

自己整合的运行图,如果有好建议和意见请告诉我,把图画好是个很好的记忆节点。

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

相关文章:

  • 2021-10-28
  • 2021-04-12
  • 2021-10-05
  • 2022-02-08
  • 2021-11-28
  • 2022-03-09
  • 2021-06-28
猜你喜欢
  • 2021-06-07
  • 2021-04-27
  • 2021-11-15
  • 2022-12-23
相关资源
相似解决方案