JVM入门篇(一)

最近在学习JVM有关知识,把自己学的总结一下,就当做分享和回顾,自己也能加深印象,写的不对的地方可以在评论区一起讨论
##1.官网
#####1.1 JDK1.8
本次jvm学习是基于JDK1.8,因为现在大多数公司都用这个版本,方便交流
JDK1.8官网https://docs.oracle.com/javase/8/
#####1.2 jdk,jre,jvm三者关系
对于三个的关系,官网有个图简单明了,如下:
1.png
##2.源码到类文件
这个过程叫做类的编译过程,把java源文件,通过编译器编译转换成JVM能识别运行的class字节码文件,图示:
2.png

##3.类文件到jvm(类加载机制)
3.png
#####3.1装载Load
首先,要知道类在哪?也就是类的全路径,主要通过类加载器加载,后续第四章详解,这边略过。
#####3.2链接Link
验证:验证类的信息是否正确,比如文件格式,元数据,字节码,符号引用
准备:为静态变量分配内存,并赋默认值
解析:把类中的符号引用转换为直接引用
#####3.3初始化Initialize
对类的静态变量,静态代码块进行初始化工作

##4.类加载器ClassLoader
顾名思义,用来加载class文件的
加载器有以下分类,见图示:
4.png
#####4.1加载原则(双亲委派)
检查某个类是否已经加载:顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个Classloader已加载,就视为已加载此类,保证此类只所有ClassLoader加载一次。
加载的顺序:加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
a5.png

##5.运行时数据区
根据官方文档,运行时数据区分区如图示:
6.png

#####5.1Method Area 方法区
方法区是各个线程共享的区域(线程不安全),在虚拟机启动时创建。
用于存储被虚拟机加载的类的信息,常量,静态变量,编译器编译后的代码等数据。
当方法区没有内存可分配的时候,会抛出OOM异常。
特别说明:1).方法区在jdk1.8以后的版本就是MetaSpace,在1.8以前就是PermSpace
2).方法区还有一个常量池,Run-Time Constant Pool
#####5.2Heap堆
Java堆是Java虚拟机所管理内存中最大的一块,在虚拟机启动时创建,被所有线程共享,所以也是线程不安全的。
Java对象实例以及数组都在堆上分配。
#####5.3虚拟机栈JVMStacks
虚拟机栈是一个线程执行的区域,保存着一个线程中方法的调用状态。换句话说,一个Java线程的运行状态,由一个虚拟机栈来保存,所以虚拟机栈肯定是线程私有的,独有的,随着线程的创建而创建。每一个被线程执行的方法,为该栈中的栈帧,即每个方法对应一个栈帧。调用一个方法,就会向栈中压入一个栈帧;一个方法调用完成,就会把该栈帧从栈中弹出。7.png
#####5.4pc Register程序计数器
程序计数器占用的内存空间很小,由于Java虚拟机的多线程是通过线程轮流切换,并分配处理器执行时
间的方式来实现的,在任意时刻,一个处理器只会执行一条线程中的指令。因此,为了线程切换后能够恢复到正确的执行位置,每条线程需要有一个独立的程序计数器(线程私有)。
如果线程正在执行Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,则这个计数器为空。
#####5.5Native Method Stacks(本地方法栈)
如果当前线程执行的方法是Native类型的,这些方法就会在本地方法栈中执行。

最后图解总结:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值