关于对jvm的初步理解

  • jvm大致构成或一个.java文件运行
    • 简要剖析
    • JVM调优,即GC(垃圾回收机制)操作

jvm大致构成或一个.java文件运行

# 首先是java文件经过编译变为class字节码文件# class文件装载到内存中,即开始与jvm有关联# 先是通过类装载子系统,然后到运行时数据区# 运行时数据区分为:本地方法栈,栈,堆,元空间(方法区),程序计数器# 同时字节码执行引擎也会对运行时数据区进行操作(即内存模型),主要对程序计数器操作,用于记录运行时环境上下文


一个线程即包含这些流程,经过这些地方(上图示)

简要剖析

  1. 栈:线程存在的地方,栈也分为一个个栈帧,一个栈帧里包含-局部变量,操作数栈,动态链接,方法出口。
  2. 本地方法栈:由native修饰的方法
  3. 堆:存放对象的地方,栈中的局部变量有引用对象,相当于项目指示。会将栈中关于对象的数据保存过来。
  4. 方法区(元空间):堆指向方法区,类似于对象和类之间的关系,方法区存放类的空间
    5.程序计数器:当字节码执行引擎进行操作时,每一步都会被程序技术器记录。指示当前运行到哪个位置了。

线程私有数据:程序计数器,本地方法栈,栈
线程共享数据:堆,元空间(方法区)

JVM调优,即GC(垃圾回收机制)操作

性能调优主要对堆进行操作

堆分为:新生代(占比1),老年代(占比2)

  • 新生代又分为:1个Eden区(占比8),2个Survivor区(总占比2,各占1)

GC分为:Minor GC、Full GC

  • Minor GC:对Eden区进行操作,将没有被使用到的对象进行清除。还在使用的移动至Survivor 0区(以下简称S0),并且对该对象进行标记1,当执行第二次minor GC时,将该对象由S0 区转移至S1区标记+1,期间有对象没有被使用了扔会被清除,当标记到累计到15时,该对象移至老年代。

  • Full GC:当老年代存储空间将占满时将进行此GC。此GC是针对整个堆而言,所以当进行Full GC时不能创建对象。在进行Full GC时会触发STW(stop the world),所以要尽量避免full GC

  • 老年代

当老年代占满时就会报下图错

以上均为个人理解希望能有些帮助对于理解,有不对的也欢迎指出,第一时间更正,以免误导