JVM的知识

  1. JVM的体系结构
    总体分为三个部分,从上到下,依次是:类加载器,运行时数据区,执行引擎和本地方法接口。其中最重要的部分是运行时数据区,该区包括:方法区,堆,java栈,本地方法栈,程序计数器。其整体架构如图所示:

运行时数据区中暗色部分代表线程私有,占用内存少;亮色部分则是可以被线程共享的,且存在垃圾回收。
2. 类加载器
掌握的三个要点:
(1) 有哪几种类加载器
(2) 双亲委托机制
(3) 沙箱安全机制
作用:负责加载class文件,class文件在文件开头有特定的文件标示,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。

通俗解释:ClassLoader就相当于快递员,因此,可以有多种类加载器

  1. 具体的类加载器
    λ 虚拟机自带的加载器
    λ 启动类加载器(Bootstrap)C++
    λ 扩展类加载器(Eextension)java
    λ 应用程序类加载器(AppClass)
    java也叫系统类加载器,加载前应用的classpath的所有类

λ 用户自定义加载器
java.lang.ClassLoader的子类,用户可以定制类的加载方式

public class MyObject {
public static void main(String[] args) {
//Object类是JDK自带的类,加载它用的是Bootstrap启动类加载器,但是该类是c++写的,因此用getClassLoader()获得的是null
Object object=new Object(); System.out.println(object.getClass().getClassLoader());
// MyObject类是自己定义的,使用的是AppClassLoader应用程序加载器
Object myobject=new MyObject(); System.out.println(myobject.getClass().getClassLoader());
}
}
运行结果:
null
jdk.internal.loader.ClassLoaders$AppClassLoader@3d4eac69

类加载器的继承结构:

public class MyObject {
public static void main(String[] args) {
Object myobject=new MyObject(); System.out.println(myobject.getClass().getClassLoader().getParent().getParent()); System.out.println(myobject.getClass().getClassLoader().getParent()); System.out.println(myobject.getClass().getClassLoader());
}
}
运行结果:
//自定义类的父亲的父亲的加载器就是启动类加载器
null
//自定义类的父亲的加载器就是扩展类加载器

jdk.internal.loader.ClassLoadersPlatformClassLoader@38af3868//自定义类的加载器就是应用程序类加载器jdk.internal.loader.ClassLoadersPlatformClassLoader@38af3868 //自定义类的加载器就是应用程序类加载器 jdk.internal.loader.ClassLoadersPlatformClassLoader@38af3868//自定义类的加载器就是应用程序类加载器jdk.internal.loader.ClassLoadersAppClassLoader@3d4eac69

4 类加载器的双亲委托机制和沙箱安全机制
当一个类收到了类加载请求,它首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载器中,只有当父类加载器反馈自己无法完成这个请求的时候(再它的加载路径下没有找到所需加载的class),子类加载器才会尝试自己去加载。
采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最后都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载最终得到的都是同样一个Object对象。

5执行引擎负责解释命令,提交操作系统执行
6 Native Interface本地接口
本地接口的作用是融合不同的编程语言为java所用。Java诞生的时候是c/c++横行的时候,要想立足,必须有调用c/c++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是Native Method Stack中登记native方法,再Execution Engine执行时加载native libraries.
Native Method Stack本地方法栈:
在Native Method Stack中登记native方法,在Execution Engine执行时加载本地方法。
7 程序计数器
每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也就是即将要执行的指定代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计。
这块内存区域很小,它是当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。
如果执行的是一个Native方法,那这个计数器是空的。
用以完成分支,循环,跳转,异常处理,线程回复等基础功能。不会发生内存溢出(OutOfMemory=OOM)错误。
通俗解释:
PC寄存器记录了方法之间的调用和执行情况,类似排班值日表,用来存储指向下一条指令的地址,也就是即将要执行的指令代码,它是当前线程所执行的字节码的行号指示器。

8 方法区
供各线程共享的运行时内存区域,它存储了每一个类的结构信息(模板),例如,运行时常量池(Runtime Constant Pool),字段和方法数据,构造函数和普通方法的字节码内容。上面讲的是规范,在不同的虚拟机里实现是不一样的,最典型的就是永久代(PermGen space)和元空间。
空调 k1=new 格力();
List list=new ArrayList();
方法区 f =new 永久代;
方法区 f =new 元空间;
但是,实例变量存在堆内存中,和方法区无关。

文章内容来自于尚硅谷视频的笔记整理,如有侵权,联系删除

JVM基础知识1---尚硅谷视频笔记整理相关推荐

  1. javascript全笔记-基础版(尚硅谷视频李立超老师)

    目录 一.JavaScript简介 1.1 JS简介 1.2 JS的HelloWorld 1.3 JS代码编写的位置 二.JS的基础语法 2.1 JS的基本语法 2.2 字面量与变量 2.3 标识符 ...

  2. 尚硅谷 JavaScript笔记 整理

    整理自https://github.com/codeOflI/codeOflI.github.io/blob/dev/source/_posts/js-note/javaScript/javaScri ...

  3. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  4. B站MySQL(尚硅谷)学习笔记

    B站MySQL基础(尚硅谷)学习笔记 最近在学习数据库技术,并且把视频中的知识点进行了汇总,字数较多,仅供参考. 会持续更新 欢迎读者提出问题与错误,一起交流~ 视频前几集所讲述的基本知识: DB:数 ...

  5. 尚硅谷JavaSE笔记(四)

    系列文章目录 尚硅谷JavaSE笔记(一) 尚硅谷JavaSE笔记(二) 尚硅谷JavaSE笔记(三) 尚硅谷JavaSE笔记(四) 文章目录 十六.File 类与 IO 流 1.java.io.Fi ...

  6. 尚硅谷 jQuery 笔记(张晓飞 2018)

    title: 尚硅谷 jQuery 笔记 date: 2020-11-24 21:40:50 toc: true description: jQuery是JS的一个封装的库函数集,用于DOM的CRUD ...

  7. 尚硅谷_CSS3 笔记

    目录 什么是CSS3 选择器 基本选择器及其扩展 属性选择器 伪类与伪元素选择器 css声明的优先级 自定义字体&字体图标 复习1 新的UI方案 文本新增样式 opacity RGBA 文字阴 ...

  8. Spring框架(基于尚硅谷视频)

    该笔记源于尚硅谷视频对Spring的讲解(适合新手,大佬划走),视频连接如下: https://www.bilibili.com/video/BV1Vf4y127N5?p=27&spm_id_ ...

  9. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  10. java不死神兔总数_Java基础知识强化之IO流笔记13:递归之不死神兔问题(斐波那契数列)...

    1.这个问题是如下的: 有一对兔子,从出生后第3个月起,每个月都生一对兔子,小兔子长到第3个月又生一对兔子,加入兔子都不死,问第20个月兔子的对数? 分析:我们找规律 兔子对数 第1个月:   1 第 ...

最新文章

  1. 【正则表达式】值匹配汉字的正字表达式
  2. WPF与缓动(一) N次缓动
  3. Flask 生成下载文件
  4. (转)B-树、B+树、B*树
  5. php 网路io是什么意思,io接口位于什么和什么之间
  6. Oracle 11g数据库基础教程(第2版)-课后习题-第十三章
  7. RTKLIB源码解析(三)、 Rinex文件读取(rinex.c)——1
  8. Clark变换和Park变换仿真验证
  9. WebGL中实现三维融合视频投影技术
  10. 2022-2027年中国服装定制行业市场全景评估及发展战略规划报告
  11. 苹果手机性能测试用是么软件,怎么检测iPhone手机性能
  12. 2015年计算机大会----顶级盛宴
  13. win10启用远程服务器访问,win10 如何打开远程服务_win10如何打开远程连接服务
  14. Vue爬坑之路 二:使用Muse-UI前端框架及axios,实现简单登录页
  15. ZJM与生日礼物【字典树】
  16. IntelliJ IDEA更换代码字体为Consolas
  17. pycharm调试技巧:添加数字书签bookmark
  18. DDP及其在pytorch中应用
  19. seo是什么意思?干什么的啊?
  20. 放下手机,我得到了什么?

热门文章

  1. svn分支合并到主干
  2. 备份 dup linux,13个开源备份解决方案盘点
  3. APM中SBUS信号解析
  4. 浅析物联网及云计算技术在传统汽车检测线中的应用
  5. 谷歌浏览器设置暗黑模式
  6. CANoe——CAPL
  7. 电大有计算机教程吗,电大教程 计算机概述.ppt
  8. iOS小技能:OCR的使用(身份证/营业执照/车牌/银行卡识别)
  9. 截图上传录屏gif上传工具推荐
  10. 渗透开发-XSS扫描器