Java基础--->JVM(1)

news2024/10/3 0:27:41

文章目录

  • 为什么学习JVM?
  • 什么是虚拟机?
  • JVM的作用
  • JVM组成部分
  • 类加载器
  • 类什么时候会被加载(初始化)
  • 有哪些类加载器
  • 什么是双亲委派机制
  • 如何打破双亲委派机制

为什么学习JVM?

​ 学习JVM是为了能更深入的理解Java这门语言,理解Java语言底层的执行过程,为后期写出优质代码做好准备。

​ 很多时候一个问题需要深入到字节码层次去分析才能得到准确的结论,而字节码就是JVM的一部分。并且以后项目上线去排查一些程序log日志中无法呈现的问题,如:内存溢出,GC太频繁导致高延迟问题

​ 对于Java程序员来说,在虚拟机内存管理机制下,不需要像C/C++语言那样手动去垃圾回收操作,不容易出现内存泄漏和内存溢出等问题。但正是因为Java程序员吧内存控制权交给Java虚拟机,一旦出现内存方面泄露和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会非常艰难。

什么是虚拟机?

​ 虚拟机就是一个虚拟的计算机,相当于一款软件,用来执行一系列虚拟的计算机指令,虚拟机分为 系统虚拟机(VMware)和程序虚拟机(JVM)

​ JVM就是Java虚拟机,是一种执行Java字节码文件的虚拟计算机(最终解释为机械执行),拥有独立的运行机制。Java虚拟机是Java技术的核心,所有的Java程序都运行在Java虚拟机的内部。

JVM的作用

总的来说,JVM就是运行Java字节码的虚拟机,运行并管理Java源码文件所生成的.class文件;JVM负责装载字节码到其内部,编译为对应平台上的机械码指令执行。

特点: 一次编译到处执行,自动内存管理,自动垃圾回收功能。

现在的 JVM 不仅可以执行 java 字节码文件,还可以执行其他语言编译后的字节码文件,是一 个跨语言平台.

JVM组成部分

JVM主要是由类加载器,运行时数据区,执行引擎,本地方法接口,垃圾回收组成

在这里插入图片描述

  • 程序在执行前先要把Java代码转换成字节码(class文件)文件,JVM需要把字节码通过一定方式的类加载器(ClassLoader) 把文件加载到内存的运行时数据区(Runtime Data Area),而字节码文件是JVM的一套指令集规范,并不能直接由底层操作系统区执行,因此需要特定的命令解析器执行引擎(Execution Engine) 将字节码翻译成底层系统指令再交给CPU去执行,这个过程中需要调用其他语言的接口 本地库接口(Native Interface) 来实现整个程序的功能。

  • 通常需要程序员调试分析的区域就是”运行时数据区“,具体一点就是”运行时数据区“里面的Heap(堆)模块。

在这里插入图片描述

类加载器

作用: 负责从硬盘/网络中加载字节码信息到内存中(运行时数据区的方法区中)

类加载过程:主要分为加载、链接、初始化,链接部分分为验证、准备、解析

  • 加载: 使用IO读取字节码文件,转换并存储,为每个类创建一个class类的对象并存储载方法区中

  • 链接:

    1. 验证:检查被加载的类的内部结构是否正确,并对字节码文件的格式进行 验证,然后判断文件是否被污染并对基本的语法格式进行验证,如果都验证通过就会进入准备阶段。

    2. 准备:为静态的变量进行内存分配,并设置默认初始值,不包含用final修饰的static 常量

    3. 解析:将符号引用转为直接引用,将字节码中的表现形式转为内存中的表现形式

  • 初始化: 类的初始化,为类中的定义的静态变量进行赋值

类什么时候会被加载(初始化)

JVM规定,每个类或者接口被首次主动使用时才对其进行初始化

1.在类中运行main方法

2.创建对象

3.使用类中的静态变量,静态方法

4.反射 Class.forName(“类的地址”);

5.子类被加载

有两种情况类不会被初始化:

  • static final int b = 20; 编译期间赋值的静态常量
  • System.out.println(User.b);
  • User[] users = new User[10]; 作为数组类型

有哪些类加载器

主要有三个类加载器,引导类加载器,扩展类加载器,应用程序类加载器,其中扩展类加载器和应用程序类加载器都属自定义类加载器(只要继承了ClassLoader类的都属于自定义类加载器)。

引导类加载器是用C/C++语言还发的,JVM底层的开发语言,负责加载Java核心类库。

扩展类加载器是从JDK系统安装目录的jre/lib/ext子目录下下载类库。

应用程序类加载器用户加载程序中自己开发的类

什么是双亲委派机制

如果一个类加载器收到了类加载请求,它并不会自己先去加载,二十把这个请求委托给父类的加载器去执行,如果父加载器还存在其父加载器,则继续向上委托,最终将到达顶层的启动类加载器,如果父类加载器可以完成类的加载任务,就成功返回,若无法完成加载任务,子加载器才会尝试自己去加载。如果都加载失败,则抛出异常ClassNotFoundException。

目的:为了先确保加载系统类

优点:安全,可以避免用户自己编写的类替换Java的核心类库,并避免类重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次

如何打破双亲委派机制

可以通过继承ClassLoader类,重写loadClass/findClass方法,实现自定义的类加载
典型的tomcat中,加载部署在tomcat中的项目时,就使用的是自己的类加载器

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

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

相关文章

推荐算法实战项目:PNN 原理以及案例实战(附完整 Python 代码)

本文要介绍的是由上海交通大学的研究人员提出的PNN(Product-based Neural Networks)模型,该模型包含一个embedding层来学习类别数据的分布式表示,此外还包含product层来捕获字段之间的特征交互模式,最后包含一个全连接…

一个实例讲讲 ChatGPT 推理

吴恩达与 OpenAI 官方联合推出了 1.5 小时的免费视频课:地址: https://learn.deeplearning.ai/chatgpt-prompt-eng/lesson/2/guidelines 今天我学了第四讲,ChatGPT Inferring,即推理 教学中,给的例子是情绪判断。 我很…

手写数字识别基本思路

问题 什么是MNIST?如何使用Pytorch实现手写数字识别?如何进行手写数字对模型进行检验? 方法 mnist数据集 MNIST数据集是美国国家标准与技术研究院收集整理的大型手写数字数据集,包含了60,000个样本的训练集以及10,000个样本的测试集。 使用P…

RIP笔记

目录 RIP路由信息协议——UDP520端口(RIPNG521端口) RIP使用的算法——贝尔曼福特算法 RIP的版本 RIP的数据包 RIP的工作过程 RIP的计时器 周期更新计时器——默认30s 失效计时器——默认180s 垃圾回收计时器——默认120s RIP的环路问题 解决方法: RIP的…

12种接口优化的通用方案

一、背景 针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 二、接口优化方案总结 1.批处理 批量思想:批量操作数据库…

Item冷启优化

Item冷启动的目标: 1.精准推荐。 2.激励发布。 3.挖掘高潜。 Item冷启动优化措施: 1.优化全链路(召回和排序) 2.流量调控(新老物品的流量分配) 评价指标: 作者侧: 发布渗透率&a…

【基于Ubuntu18.04+Melodic的realsense D435安装】

【基于Ubuntu18.04Melodic的realsense D435安装】 1. RealSense SDK安装1.1 克隆SDK1. 2 安装相关依赖1.3 安装权限脚本1. 4 进行编译与安装1.5 测试安装是否成功 2. D435i 安装ROS接口2.1 方法一realsense—ros源码2.2 方法二安装相机库 3. 总结 1. RealSense SDK安装 系统硬…

C++:分治算法之选择问题的选择第k小元素问题

目录 3.2.6 选择问题 分析过程: 解法一: 算法代码: 【单组数据】 【多组数据】 运行结果: 解法二 代码: 运行结果: 解法三: 3.2.6 选择问题 ¢ 对于给定的 n 个元素的数组 a[0 …

DAY 53 Haproxy负载均衡集群

常见的Web集群调度器 目前常见的Web集群调度器分为软件和硬件: 软件通常使用开源的LVS、Haproxy、 Nginx LVS性能最好,但是搭建相对复杂;Nginx 的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能…

第一章 Linux是什么

Linux是一套操作系统,如同下图所示,Linux就是核心与系统调用接口那两层。至于应用程序不算Linux。 1.1 Linux当前应用的角色 由于Linux kernel实在是非常的小巧精致,可以在很多强调省电以及较低硬件资源的环境下面执行; 此外&…

【Elasticsearch】NLP简单应用

文章目录 NLP简介ES中的自然语言处理(NLP)NLP演示将opennlp插件放在ESplugins路径中下载NER模型配置opennlp重启ES、验证 NLP简介 NLP代表自然语言处理,是计算机科学和人工智能领域的一个分支。它涉及使用计算机来处理、分析和生成自然语言,例如英语、中…

企业对网络安全的重视度开始降低

近日,英国科学技术部发布了《2023年企业网络安全合规调查报告》( Cyber Security Breaches Survey ),对英国所有企业和社会性组织目前的网络威胁态势和合规建设进行研究,同时也就如何提升新一代网络应用的合规性给出专…

02-管理员登录与维护 尚筹网

一、管理员登陆 需要做的: 对存入数据库的密码进行MD5加密在登录界面登录失败时的处理抽取后台页面的公共部分检查登录状态,防止未登录时访问受保护资源的情况 具体操作如下: 1)、MD5加密 ​ 使用到的CrowdConstant类中的一些…

人的全面发展评价指标体系—基于相关-主成分分析构建

本文先从经济、社会、生活质量和人口素质四个方面海选了众多人的全面发展评价指标,然后根据可观测性原则剔除无法获得的指标进行了初步筛选,再利用相关性分析删除相关系数大的指标,以及通过主成分分析删除因子负载小的指标,完成了…

CCD视觉检测设备如何选择光源

CCD视觉检测设备的机器视觉系统对光源的要求很高,光源是决定图像质量的一个重要因素。那么,我们就来看看CCD图像加网设备和机器视觉系统光源的选择点——CCD图像加网设备。 CCD视觉检测设备机器视觉系统光源选择要点: 1. 对比度:…

最新VUE面试题

前言 本文以前端面试官的角度出发,对 Vue 框架中一些重要的特性、框架的原理以问题的形式进行整理汇总,意在帮助作者及读者自测下 Vue 掌握的程度。 本文章节结构以从易到难进行组织,建议读者按章节顺序进行阅读,当然大佬级别的…

P1915 [NOI2010] 成长快乐

此题为世纪难题 题目提供者 洛谷 难度 NOI/NOI/CTSC 输入输出样例 输入 #1 5 1 6 0 0 1 5 2 2 0 0 输出 #1 1 5 5 2 2 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~此题非常难,小白就不用想着独自完成了 题解: #…

如何在 Windows 11 启用 Hyper-V

准备在本机玩一下k8s,需要先启用 Hyper-V,谁知道这一打开,没有 Hyper-V选项: 1、查看功能截图: 2、以下文件保存记事本,然后重命名为*.bat pushd "%~dp0" dir /b %SystemRoot%\servicing\Packa…

常用的MySQL 优化方法

数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷。   本文我们来谈谈项目中常用…

maven中的 type ,scope的作用

dependency为什么会有type为pom,默认的值是什么? dependency中type默认为jar即引入一个特定的jar包。那么为什么还会有type为pom呢?当我们需要引入很多jar包的时候会导致pom.xml过大,我们可以想到的一种解决方…