01_JVM快速入门

news2024/12/22 17:11:11

从面试开始:

  1. 请谈谈你对JVM 的理解?java8 的虚拟机有什么更新?

  2. 什么是OOM ?什么是StackOverflowError?有哪些方法分析?

  3. JVM 的常用参数调优你知道哪些?

  4. 内存快照抓取和MAT分析DUMP文件知道吗?

  5. 谈谈JVM中,对类加载器你的认识?

​ 位置:JVM是运行在操作系统之上的,它与硬件没有直接的交互

1. 结构图

方法区:存储已被虚拟机加载的类元数据信息(元空间)

堆:存放对象实例,几乎所有的对象实例都在这里分配内存

虚拟机栈(java栈):虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息

程序计数器:当前线程所执行的字节码的行号指示器

本地方法栈:本地方法栈则是为虚拟机使用到的Native方法服务

2. 类加载器ClassLoader

负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。

类加载器分为四种:前三种为虚拟机自带的加载器。

  • 启动类加载器(Bootstrap)C++

    负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

  • 扩展类加载器(Extension)Java

    负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

  • 应用程序类加载器(AppClassLoader)Java

    也叫系统类加载器,负责加载classpath(java.class.path)中指定的jar包及目录中class

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

工作过程:

  • 1、当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。

  • 2、当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。

  • 3、如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载;

  • 4、若ExtClassLoader也加载失败,则会使用AppClassLoader来加载

  • 5、如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException

其实这就是所谓的双亲委派模型。简单来说:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上

为什么要设计双亲委派机制?

  • 沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
  • 避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性

写段儿代码演示类加载器:

public class Demo {

    public Demo() {
        super();
    }

    public static void main(String[] args) {
        Object obj = new Object();
        String s = new String();
        Demo demo = new Demo();
        System.out.println(obj.getClass().getClassLoader());
        System.out.println(s.getClass().getClassLoader());
        System.out.println(demo.getClass().getClassLoader().getParent().getParent());
        System.out.println(demo.getClass().getClassLoader().getParent());
        System.out.println(demo.getClass().getClassLoader());
        
        System.out.println("BootstrapClassLoader加载的文件: ");
        URL[] urls = Launcher.getBootstrapClassPath().getURLs();
        for (URL url : urls) {
            System.out.println(url);
        }
        System.out.println("ExtClassLoader加载的文件: ");
        System.out.println(System.getProperty("java.ext.dirs"));
        System.out.println("AppClassLoader加载的文件: ");
        System.out.println(System.getProperty("java.class.path"));
    }
}

打印控制台中的sun.misc.Launcher,是一个java虚拟机的入口应用

AppClassLoader加载类的双亲委派机制源码:

//AppClassLoader的loadClass方法,里面实现了双亲委派机制
protected Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
        // 检查当前类加载器是否已经加载了该类
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                //如果当前加载器父加载器不为空则委托父加载器加载该类
                if (parent != null) { 
                    c = parent.loadClass(name, false);
                } else { 
                    //如果当前加载器父加载器为空则委托引导类加载器加载该类
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non‐null parent class loader
            }

            if (c == null) {
                // If still not found, then invoke findClass in order
                // to find the class.
                long t1 = System.nanoTime();
                //都会调用URLClassLoader的findClass方法在加载器的类路径里查找并加载该类
                c = findClass(name);
                // this is the defining class loader; record the stats
                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 ‐ t0);
                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                sun.misc.PerfCounter.getFindClasses().increment();
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}

3. 执行引擎Execution Engine

Execution Engine执行引擎负责解释命令,提交操作系统执行。

4. 本地接口Native Interface

本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序,Java 诞生的时候是 C/C++横行的时候,要想立足,必须有调用 C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是 Native Method Stack中登记 native方法,在Execution Engine 执行时加载native libraies。

目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间的通信很发达,比如可以使用 Socket通信,也可以使用Web Service等等,不多做介绍。

5. Native Method Stack

它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库。

6. PC寄存器(程序计数器)

每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,即 将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。

7. Method Area方法区

方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。简单说,所有定义的方法的信息都保存在该区域,此区属于共享区间

静态变量+常量+类信息(构造方法/接口定义)+运行时常量池存在方法区中

But

实例变量存在堆内存中,和方法区无关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/570795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年第十五届电工杯选题浅析

本次电工杯作为2023年上半年度数学建模赛事的收官之战&#xff0c;报名队伍最后截止统计已经达到12000支队伍&#xff0c;同时免费的报名费也让这个收官之战&#xff0c;被很多建模小白当作第一次练手赛。为了帮助大家选题&#xff0c;下面为大家带来AB两题的思路浅析&#xff…

凌恩生物文献分享 | 癌症领域新曙光——肿瘤内微生物

上一期我们给大家介绍了肿瘤胞内菌在癌症转移中发挥的作用。2022年12月&#xff0c;蔡尚老师团队在Cell子刊-Trends in Cell Biology上又发表了一篇总结肿瘤内菌群在癌症转移中最新发现的综述&#xff0c;其中讨论了癌症治疗遇到的新挑战。 研究亮点 1&#xff09;癌症转移是…

Leetcode 1679. K 和数对的最大数目 双指针法

https://leetcode.cn/problems/max-number-of-k-sum-pairs/ 给你一个整数数组 nums 和一个整数 k 。 每一步操作中&#xff0c;你需要从数组中选出和为 k 的两个整数&#xff0c;并将它们移出数组。 返回你可以对数组执行的最大操作数。 示例 1&#xff1a; 输入&#xff1…

【JS】1693- 重学 JavaScript API - Web Storage API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API 7. Performance API ❞ 在 Web 开发中经常需要在客户端保存和获取数据&#xff0c;Web Storage API 提供了一种在浏览器中存储…

【sop】含储能及sop的多时段配网优化模型

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了含sop的配电网优化模型&#xff0c;链接含sop的配电网优化,很多同学在咨询如何增加储能约束&#xff0c;并进行多时段的优化&#xff0c;本次拓展该部分功能&#xff0c;在原代码的基础上增加储能模…

Paragon NTFS2023最新mac免费实用工具磁盘工具

mac虽然系统稳定&#xff0c;但在使用过程中也有一些瑕疵&#xff0c;如当mac连接到ntfs格式移动磁盘时&#xff0c;可能会出现移动磁盘无法在mac被正常读写的状况。遇到移动磁盘无法正常读写的状况&#xff0c;我们可以在mac中使用磁盘工具&#xff0c;以使mac获得对ntfs格式移…

Docker实战1-运行前端Vue项目

本次运行了两个项目&#xff0c;一个是开源的镜像&#xff0c;一个是自己的前端项目镜像 1 在docker中运行 keycloak docker run -p 8080:8080 -e KEYCLOAK_ADMINadmin -e KEYCLOAK_ADMIN_PASSWORDadmin quay.io/keycloak/keycloak:21.1.1 start-dev 这个最简单了&#xff0c…

版图设计IC617 virtuoso启动以及smic18mmrf加载库

一. 启动virtuoso 1.1 创建一个目录用于库管理 mkdir pro3 1.2 拷贝.bashrc到工程目录下&#xff0c;.bashrc存在~目录下&#xff0c;是一个隐藏文件&#xff0c;需要用ls -la查看 1.3 执行.bashrc文件 1.4 启动 virtuoso & 1.5 检查库中是否包含系统基本库&#xff0c;如…

【JavaSE】Java基础语法(十三):Java 中的集合(十分全面)

文章目录 List, Set, Queue, Map 四者的区别&#xff1f;集合框架底层数据结构总结ArrayList 和 Vector 的区别ArrayList 与 LinkedList 区别补充内容:RandomAccess 接⼝ArrayList 的扩容机制comparable 和 Comparator 的区别比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同…

Java jdbcTemplate 获取数据表结构

表结构如图 代码 AutowiredJdbcTemplate jdbcTemplate;Testpublic void getColumnNames() throws Exception {String sql "select * from tb_test where 12 ";SqlRowSet sqlRowSet jdbcTemplate.queryForRowSet(sql);SqlRowSetMetaData sqlRsmd sqlRowSet.getMeta…

高手速成 | 过滤器、监听器的创建与配置

本节讲解过滤器、监听器的创建以及监听事件配置示例。 01、过滤器的创建与配置 【例1】创建过滤器及配置过滤规则。 (1) 在Eclipse中新建一个Web项目&#xff0c;取名为Chapt_09。在src目录下&#xff0c;新建一个名为com.test.filter的包。选中该包并按CtrlN组合键&#xf…

Linux之软件包管理

软件包管理 RPM RPM 概述 RPM&#xff08;RedHat Package Manager&#xff09;&#xff0c; RedHat软件包管理工具&#xff0c; 类似windows里面的setup.exe&#xff0c;是Linux这系列操作系统里面的打包安装工具&#xff0c; 它虽然是RedHat的标志&#xff0c; 但理念是通用…

Python自动化对每个文件夹及其子文件夹的Excel表加个表头(Excel不同名且有xls文件)...

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 惟将旧物表深情&#xff0c;钿合金钗寄将去。 大家好&#xff0c;我是皮皮。 一、前言 上一篇文章&#xff0c;我们抛出了一个问题&#xff0c;这篇文章…

【iOS锁_@synchronized源码浅析】

文章目录 前言synchronized介绍加锁实例synchronized实现objc_sync_enter 和 objc_sync_exit objc_sync_enterobj存在SyncList的结构SyncList和SyncData的关系id2data函数的实现1. 使用快速缓存2. 获取该线程下的SyncCache3. 全局哈希表查找4. 生成新数据并写入缓存 总结 前言 …

35从零开始学Java之析构方法又是咋回事?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥给大家详细地介绍了构造方法的使用、特点等内容。我们知道&#xff0…

ESP32 :项目的创建及项目架构解析

一、项目的创建 方式一&#xff1a;基于IDF示例创建 在ESP&#xff0d;IDF中有example示例库&#xff0c;以其中的一个示例为模板创建项目。 1、打开示例库 查看 - 命令面板&#xff08;也可以按住CtrlShiftP 或 F&#xff11;&#xff09; 输入 show examples projects 2…

大数据开发之Hive案例篇8-解析XML

文章目录 一. 问题描述二. 解决方案2.1 官方文档2.2 XML格式不规范 一. 问题描述 今天接到一个新需求&#xff0c;hive表里面有个字段存储的是XML类型数据 数据格式: <a><b>bb</b><c>cc</c> </a>二. 解决方案 2.1 官方文档 遇到不懂的…

PyTorch-Forecasting一个新的时间序列预测库

时间序列预测在金融、天气预报、销售预测和需求预测等各个领域发挥着至关重要的作用。PyTorch- forecasting是一个建立在PyTorch之上的开源Python包&#xff0c;专门用于简化和增强时间序列的工作。在本文中我们介绍PyTorch-Forecasting的特性和功能&#xff0c;并进行示例代码…

xhs小红薯【帖子】采集工具python爬虫抓取

一、xhs【帖子/笔记/视频】采集工具链接 &#xff08;请复制链接至浏览器&#xff0c;进行数据采集&#xff09; http://106.53.68.168:9920/xhs-keyword-spider 能爬取到的属性字段如图1 (点击右侧下拉按钮&#xff0c;可任选字段&#xff09; 图1属性字段 二、爬取规则 …

计算机毕业论文选题推荐|软件工程|系列九

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)学生在校信息管…