jvm学习笔记

jvm学习笔记

文章目录

  • jvm学习笔记
  • 前言
  • 一、jvm的内存结构?
    • 1.类加载器
      • 1.1.双亲委派
    • 2.运行时数据区
      • 2.1.程序计数器
      • 2.2.虚拟机栈
      • 2.3.本地方法栈
      • 2.4.方法区
      • 2.5.堆
        • 2.5.1.堆的结构
        • 2.5.2.GC过程
        • 2.5.3.三色标记
        • 2.5.4.垃圾收集器类型
  • 二.什么是对象
    • 1.对象的结构


前言

说到jvm,就很容易想到jdk,jre,jvm,众所周知,jre是java运行环境,jdk是java开发工具,而jvm是java虚拟机,是运行java应用,可以跨平台的。

一、jvm的内存结构?

jvm的内存结构,包含了类加载器,字节码执行引擎,运行时数据区

1.类加载器

类加载器就是从各种渠道把class文件加载到jvm变成class对象的过程。

1.1.双亲委派

双亲委派就是当类加载器接收到类加载的请求的时候,他会委派给父类加载器,让他的搜索范围内搜索,看是否有这个类的信息,如果没有的话,子类加载器在进行搜索加载,为什么会存在双亲委派呢,这个主要因为防止在内存中存在多份一样的字节码。

举个例子:我们创建了java.lang.object这个类,如果没有双亲委派的话,直接把他放在classPath中,内存中就会出现多个这个类,就不能保证类的唯一性。

那么能不能打破双亲委派?
其实是可以的,打破双亲委派的话不进要继承classLoad类,还需要重写findClass和loadClass方法

2.运行时数据区

它主要被分为两块的,线程共享和线程私有,其中线程共享包含了,堆,方法块(元空间),线程私有里存在程序计数器,本地方法栈,虚拟机栈,由这些组成了他的内存结构,那么细说下里面的具体东西

2.1.程序计数器

程序计数器的作为就是用来记录程序在jvm里运行的行数,在把class文件加载到jvm形成java对象的时候,在jvm里每行代码前都会有代码行数,而程序计数器就是记录代码运行到了哪一行,这个记录是由字节码执行引擎进行修改行数。

假如来了一个需要先执行的线程,那么就会把当前的线程挂里,先去执行这个优先级高的线程,等这个线程之行结束后,再来执行这个被挂起的线程,这时候就需要从程序计数器中获取到执行行数来进行继续执行了。

2.2.虚拟机栈

虚拟机战的生命周期其实和线程的生命周期是一样的,它主要存储了变量,在每个线程进来的时候会单独从堆里挖一块内存,每个线程里包含了程序计数器,栈,本地方法栈,在栈里的话,线程里的每个方法都会形成一个栈帧,主要有局部变量表,操作数栈,动态链接,方法出口。当线程开始运行的时候,会把方法里的变量存储在栈帧里面的局部变量表里,在代码运行过程中所执行的一些操作,会存放在操作数栈中,操作数栈也遵循着栈的先进后出原则,执行到这一步的时候,会把当前操作的数据放在操作数栈,等jvm的这行代码执行完,他会出栈进行销毁然后把结果集在放入局部变量表中

2.3.本地方法栈

jvm底层的本地方法栈,不做叙述

2.4.方法区

主要存储常量,类信息,静态变量

2.5.堆

它是jvm里最大的一块内存,主要用于存储对象,它是线程共享的,所以线程不安全。

2.5.1.堆的结构

他的主要结构呢分为了年轻代和老年代,他们的占比为,年轻代为三分之一,老年代为三分之二。
而年轻代里有包含了edan区域和两个survivor区域,占比为8:1:1。

2.5.2.GC过程

这是怎么个运行的过程呢?
当有对象放入堆的时候,会首先进去edan区域,当出现大量的对象,edan区域放不下了之后,就会把对象转移到survivor区域,edan区域就有空间继续存放对象,前面我们说了survivor区域有两个,他们是可以互相跳转的,当survivor区域也满了,就会发生一次minor gc进行垃圾清理回收操作,这里就涉及到了垃圾回收算法。如果说在survivor里的对象他还有用的话,每过一个minor gc,都没背清理掉,每一次过程中,他的年龄就会加一,默认当年龄达到15岁的时候,就会被转移到老年代,进入老年代的情况还有,当有一个大对象的时候,也就是他的内存要求达不到了,会直接进入老年代。当老年代最存放满了之后,会进行full gc,最后内存溢出。
在上面说到垃圾回收算法,主要有标记-清理算法,标记-复制,标记-整理算法

2.5.3.三色标记

这里会根据三色标记,白灰黑,从gc root开始寻找,默认都是白色,然后根据根节点开始根据指针找有相关联的对象,在找的过程中颜色会变成灰色,当全部找完了之后呢,颜色会变成黑色,然后堆位标记为黑色的全部清除。这是一次gc的过程。
不过在这其中,又牵扯到一个知识点,就是在根据指针寻找的时候,是什么引用,是否可以进行收集,这里引用呢,分为了强引用,软引用,弱引用,虚引用
强引用:默认使用的引用,new出来一个新对象的时候为强引用,在回收的时候有强引用的关系就不会被回收。
软引用:当知存在软引用的关系的时候,如果内存够用,则不会回收,内存不足的情况下会进行回收
弱引用:它有短暂的生命周期,当还没有被扫描到的时候,它存活,北岛秒到了就会被回收
虚引用:它相当于没有引用,随时回收。

2.5.4.垃圾收集器类型

还有当然的 gc的模式可以修改,也就是垃圾收集器的类型
主要有以下几种类型;
1.串行垃圾收集器(serial 收集器):他的特点是单线程收集器,在运行的时候必定发生stop the word,但是内存消耗小,比较简单,使用标记复制算法
2.并行垃圾收集器(parallel scavange收集器):他是并发的多线程垃圾收集器,是新生代收集器,目标是达到可控的吞吐量,使用标记复制算法
3.parNew收集器:是seial收集器的多线程版,运行时会发生stop the word,使用标记复制算法
4.serial Old收集器:serial的老年代收集器,使用标记整理算法
5.parallel Old收集器:parallel scavange收集器的老年代收集器
6.cms收集器:主流常用收集器,他的目的以最小的停顿时间的收集器,比较看重响应速度。主要用于老年代,需配合其他收集器一起使用,他使用的是标记清理算法(初始标记-并发标记-重新标记-批量处理),会产生大量的空间碎片
7.G1收集器:主流常用收集器,主要用于大内存几G-几十G,主要用于分部式机器,它是能够准确的控制停顿时间,追求比较稳定的响应时间,它是新生代和来年代都适用的,使用的标记整理算法(初始标记-并发标记-最终标记-筛选标记)

jvm学习笔记_第1张图片

二.什么是对象

1.对象的结构

  1. 对象头
    • mark word:存储对象运行时的数据,比如所类型,对象年龄代,hash值,线程持有的锁,线程id等。
    • 数组长度:如果对象不是数组类型的话,则没有这部分。
    • 指针类型:指向元空间类信息的指针,jvm通过它来确定该对象时哪个类的实例。
  2. 实例数据
    • 就是对象里的字段和存储的值,包括从父类继承的字段和自身的字段
  3. 对齐填充
    • jvm要求对象的其实地址是8的倍数,如果不满8的话会在后面补齐

你可能感兴趣的:(jvm,学习,笔记)