Java JVM&GC

JVM&&GC

1.JVM概述

什么是虚拟机?

  • 虚拟机:模拟某种计算机体系结构,特殊特定指令集的软件。
  • 分为两大类:
    • 系统虚拟机(Virtual Box,VMware);
    • 程序虚拟机(JVM,NET CLR,P-Code)

什么是Java虚拟机

在这里插入图片描述

Java虚拟机架构

在这里插入图片描述

  • 1,程序计数器:指向当前线程正在执行的字节码的地址,行号。线程
    私有,无GC。

  • 2,虚拟机栈:存储当前线程运行方法所需要的数据,指令,返回地
    址。线程私有,无GC。

  • 3,本地方法栈:同虚拟机栈,不同的是,它存的是本地方法的数据。

  • 4,方法区:存储类信息(字段方法的字节码,部分方法的构造器),常
    量,静态变量,JIT(即时编译的信息)。线程共享,无GC,非堆区。
    java.lang.OutOfMemoryError: PermGen space)

  • 5,堆-heap: 存储类实例,-个jvm实例只有一个堆内存。线程共享,
    要GC。

  • Jdk1.6及之前:有永久代字符串常量池和运行时常量池在方法区

  • Jdk1.7:有永久代, 但已经逐步“去永久代”,字符串常量池移到堆
    中,运行时常量池还在方法区中(永久带)

  • Jdk1.8及之后:无永久代,字符串常量池在堆中,运行时常量池在元
    空间

  • 方法区是一种定义,概念。而所谓永久代或元空间是其一种实现机制。

Hostpot虚拟机

在这里插入图片描述

共有设计,私有实现

在这里插入图片描述
在这里插入图片描述

2.类加载

类加载器

在这里插入图片描述

  • -verbose:class:显示类加载过程(在VM option中填写)

在这里插入图片描述
在这里插入图片描述

/**
 * 三个类加载器
 * 1.引导(启动)类加载器
 * 2.扩展类记载器
 * 3.系统类加载器
 */
public class Main {
    public static void main(String[] args) {
        //获取系统类加载器
        //1.ClassLoader.getSystemClassLoader();
        ClassLoader appClassLoader1 = ClassLoader.getSystemClassLoader();
        //2.
        ClassLoader appClassLoader2 = Main.class.getClassLoader();
        System.out.println(appClassLoader1.toString());
        System.out.println(appClassLoader2.toString());

        //获取扩展类加载器
        ClassLoader extentClassLoader = appClassLoader1.getParent();
        System.out.println(extentClassLoader.toString());
        ClassLoader extClassLoader = SunEC.class.getClassLoader();
        System.out.println(extClassLoader.toString());

        //启动类加载器(c语言实现的,看不见)extClassLoader.getParent()为空
        //,加toString,会空指针异常
        System.out.println(extClassLoader.getParent());//null


    }
}

类加载过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

面试题
public class Main {
    public static void main(String[] args) {
        //第一题 0 1 2
        //第二题  0 2 3
        System.out.println(T.count);
    }
}
class T{
    private static T t = new T();
    public static int count=2;
    private T(){
        count++;
    }
}

在这里插入图片描述

双亲委托机制

在这里插入图片描述
在这里插入图片描述

package java.lang;

public class String {
    public static void main(String[] args) {
        System.out.println("java.lang.String.");
    }
}

错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application
package java.lang;


public class MyString {
    public static void main(String[] args) {
        System.out.println("java.lang.MyString");
    }
}


java.lang.SecurityException: Prohibited package name: java.lang
  • 向上委托后,在向下委托,都干不了,又ApplicationClassLoader加载,但是不能使用,java.lang包,所以报错。
    在这里插入图片描述

使用类加载器夹杂属性文件


public class Main {
    public static void main(String[] args) throws IOException {
        //src :source文件生成.class文件 打包完就没这个目录了。
        //使用类加载器加载属性文件
        //获取的是项目根目录
        //建议使用
        InputStream is = Main.class.getClassLoader().getResourceAsStream("user.properties");

        //以当前目录为指针写文件,如果不在本目录同一层使用/com/demodong....
        //    /com/demodong  中的  /为根目录。
//        Main.class.getResourceAsStream()
        Properties properties = new Properties();
//        FileInputStream fis = new FileInputStream("src\\user.properties");
        properties.load(is);
//        fis.close();
        is.close();
        properties.list(System.out);
    }
}


运行jar包:java -jar xx.jar

3.运行时数据区

概念

http://dwz.date/b6dw
在这里插入图片描述

程序计数器

在这里插入图片描述

虚拟机栈和本地方法栈

在这里插入图片描述

栈帧

在这里插入图片描述
在这里插入图片描述

  • 栈帧包含
  • 1.局部变量表,
  • 2.操作数栈
  • 3.动态连接
  • 4.方法返回地址。

栈帧结构-局部变量表

在这里插入图片描述

栈帧结构-操作数栈

在这里插入图片描述

Demo

在这里插入图片描述
在这里插入图片描述

栈帧结构-动态连接

在这里插入图片描述

栈帧结构-方法返回地址

在这里插入图片描述

在这里插入图片描述

        System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);  //1/64
        System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);
        System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024); //  1/4
-Xms10m -Xmx10m

在这里插入图片描述
在这里插入图片描述

简单查看栈溢出

public class Main {
    public static void main(String[] args) throws InterruptedException {
         byte []buffer=new byte[1024*1024*7];
         buffer=null;
         Thread.sleep(1000);
    }


    /**
     * 栈帧:
     * 1.局部变量表
     * 2.操作数栈
     * 3.动态连接
     * 4.返回地址。
     */
}


设置虚拟机的大小
在这里插入图片描述
在这里插入图片描述

  • 首先轻度GC进行两次垃圾回收,不行了使用重度GC进行搞。
    在这里插入图片描述
    在这里插入图片描述
  • 空的为to。
  • 阀值为15放进老年代。
    • 年轻代(Young generation)
    • 伊甸园(Eden)
    • 幸存区(Survivor Scope)
      • from
      • to (空的为to)
  • 老年代(Old generation)

堆-对象分配策略

在这里插入图片描述
在这里插入图片描述

Java对象

在这里插入图片描述

方法区

在这里插入图片描述

运行时常量池

在这里插入图片描述

HotSpot方法区实现的变迁

在这里插入图片描述
在这里插入图片描述

直接内存

在这里插入图片描述

其他空间

在这里插入图片描述

逃逸分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.垃圾判断

什么是垃圾回收

在这里插入图片描述

垃圾判定

在这里插入图片描述

引用计数算法

在这里插入图片描述

可达性分析算法

在这里插入图片描述

Root对象

在这里插入图片描述

Java对象引用

在这里插入图片描述
在这里插入图片描述

finalization

在这里插入图片描述
在这里插入图片描述

5.垃圾回收算法

java的垃圾回收

在这里插入图片描述

常用的垃圾回收算法

在这里插入图片描述

标记-清除算法(Mark-Sweep)

在这里插入图片描述

标记-整理算法(Mark -Compact))

在这里插入图片描述

复制算法(Copying)

在这里插入图片描述

分代收集算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.垃圾收集器

在这里插入图片描述

Serial收集器(串行收集器)

在这里插入图片描述

ParNew收集器

在这里插入图片描述

Parallel Scavenge收集器

在这里插入图片描述

Serial Old 收集器

在这里插入图片描述

Parallel Old收集器

在这里插入图片描述

CMS收集器

在这里插入图片描述
在这里插入图片描述

G1收集器

在这里插入图片描述

其他收集器

在这里插入图片描述

ZGC,Epsilon,Sehnandoah

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值