JVM学习笔记day01

2 篇文章 0 订阅

JVM

三种JVM

Sun公司的HotSpot
BEA公司的JRockit
https://baike.baidu.com/item/JRockit/5079300
IBM公司的J9 VM
http://book.51cto.com/art/201306/399155.htm

JVM虚拟机架构

重点
在这里插入图片描述

类加载器

类加载器过程

在这里插入图片描述

  • 类加载器子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识
  • ClassLoader只负责Class文件的加载,至于他是否可以运行,则由ExecutionEngine决定。
  • 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还会包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)

类加载器ClassLoader角色
在这里插入图片描述

类加载过程

在这里插入图片描述
在这里插入图片描述
a.加载
获取class文件加载成二进制字节流
把改文件的编码结构----->运行时的内存结构
在内存中生成该类的一个Class对象
jclasslib-bytecode-viewer
b.连接
验证:保证加载类的一个正确性
准备:为类变量分配内存 设置类变量的初始值
解析:相当于翻译过程
初始化
初始化节点就是执行类构造器的过程
不同于构造器
收集静态变量赋值和静态代码块

类加载器的分类(重点)

  • JVM支持两种类型的类加载器,分别是引导类加载器(Bootsrap ClassLoader)自定义类加载器(User-Defined ClassLoader)

  • 从概念上,自定义类加载器一般指的是程序由开发人员自定义的一类类加载器,但是Java虚拟器规范却没有这么定义,而是将所有派生于抽象类的ClassLoader都划分为自定义类加载器。

  • 无论加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如下所示:
    在这里插入图片描述
    虚拟机自带的加载器:

  • 启动类加载器(引导类加载器,Bootstrap ClassLoader)
    在这里插入图片描述

  • 扩展类加载器(Extension ClassLOader)
    在这里插入图片描述

  • 应用程序类加载器(系统类架子阿奇,ApplicationClassLoader)

在这里插入图片描述

  • 用户自定义类加载器
    在这里插入图片描述
    用户自定义类加载器实现步骤

     1.开发人员可以通过继承抽象类java.lang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求
     
     2.在JDK1.2之前,在定义类加载器时,总会去继承ClassLoader类并重写loadcClass()方法,从而实现自定义的类加载	  类,但是在JDK1.2之后已不再建议用户去覆盖loadClass()方法,而是建议把自定义的类加载逻辑写在findClass()方法中
     
     3.在编写自定义类加载器时,如果没有太过于复杂的需求,可以直接继承URLClassLoader类,这样就可以避免自己去编写findClass()方法机器获取字节码流的方式,使自定义类加载器编写更加间接。
    

双亲委派机制

Java虚拟机对class文件采用的是按需加载的方式,也就是当需要使用该类时才会讲他的class文件加载到内存生成class对象,而且家在某个类的class文件,Java虚拟机采用的是双亲委派模式,即吧请求交给父类处理,它是一种任务委派模式。
在这里插入图片描述
在这里插入图片描述
优势

  1. 避免类的重复加载
  2. 保护程序安全,防止核心API被随意篡改
    - 自定义类;java.lang.String
    - 自定义类:java.lang.ShkStart
    在这里插入图片描述

沙箱安全机制

在这里插入图片描述

运行时数据区内部结构

内部整体结构

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

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

PC寄存器

在这里插入图片描述
JVM中的一种程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的线程信息,CPU只有把数据装载到寄存器才能运行。
JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟器,并非真实的寄存器。

作用: PC寄存器用来存储指向下一条指令的地址,也即将执行的指令代码。由执行引擎读取下一条指令。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本地方法

在这里插入图片描述
在这里插入图片描述
本地方法

a.概念: java调用非java的那些代码接口

b.作用:与java外界进行交互

c.本地方法栈: 用来管理本地方法的结构

本地方栈

在这里插入图片描述

虚拟机栈

基本概念

栈式运行时的单位,而堆是存储的单位。

在这里插入图片描述
作用:
主管Java程序的运行,它保存方法的局部变量(八种基本数据类型、对象的引用地址)、部分结果,并参与方法的调用和返回

栈帧

概念
每个线程都有自己的栈,栈中的数据以栈帧格式存在,每个方法对应一个栈帧

存储内容

在这里插入图片描述

栈运行原理

在这里插入图片描述

在这里插入图片描述

组成部分–局部变量表

在这里插入图片描述

组成部分–操作数栈

在这里插入图片描述

堆空间

核心概述

基本概念

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

插件安装在这里插入图片描述

在这里插入图片描述

栈内存细分

组成部分

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

OOM内存溢出

在这里插入图片描述

新生代和老年代

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

内存分配策略

在这里插入图片描述

TLAB

在这里插入图片描述

在这里插入图片描述

图解对象分配过程

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值