JVM(上)

目录

一、JVM概述

        一、JVM作用

        二、JVM整体组成部分

二、JVM结构-类加载

        一、类加载子系统概述

        二、类加载过程

        1.加载

        2.链接

        3.初始化(类加载过程中的初始化)

        三、类加载器分类

        大致分两类:

        细致分类:

        四、双亲委派机制

        五、打破双亲委派机制

三、JVM运行时数据区

        一、运行时数据区组成概述

        二、程序计数器

        特点: 

        三、Java虚拟机栈

        1、特点:

        2、栈帧构成:

        四、本地方法栈

        1、作用:

        2、特点:

        五、Java堆内存

            1、特点:

            2、堆内存区域划分:

            3、分区原因:

            4、对象创建内存分配过程

            5、堆空间的参数设置

            6、方法区


一、JVM概述

        一、JVM作用

        JVM负责把字节码文件(.class)加载到虚拟机中,再把字节码文件解释/编译为机器码,管理运算时数据存储,垃圾回收。现在JVM还可以执行其他语言编译后的字节码文件。

        二、JVM整体组成部分

        1.类加载器:从硬盘上加载字节码文件到JVM中。

        2.运行时数据区:按照不同的数据类型进行分区存储(方法区、堆、栈(用于放自己的方法)、本地方法栈(调用本地方法),程序计数器(用于线程切换,记录程序运行到那行))。

        3.执行引擎:将字节码再次编译/解释成机器码 。

        4.本地方法接口:调用本地操作系统方法接口。

其大致操作流程如下所示:

二、JVM结构-类加载

        一、类加载子系统概述

                从硬盘上加载字节码文件到JVM中。

        二、类加载过程

        

        1.加载

        以二进制字节流方式加载字节码。(通过类名/地址获取类的二进制字节流)

        在内存中为类生成一个class类对象,将静态存储转为运行时存储。(从硬盘到内存,用来生成class对象方法)

        2.链接

         1.验证:验证字节码格式是否正确,语法是否正确。   

         2.准备:为类的静态属性分配内存,并设初值。(但注意final static常量是在编译时设的初值)

         3.解析 :静态文件中符号(指令符号)引用替换成内存中直接引用。(符号引用是 Class 文件的逻辑符号,直接引用指向的方法区中某一个地址)

        3.初始化(类加载过程中的初始化)

        对类变量(静态变量进行赋值)

        类被初始化的时间有:使用类中静态变量,静态方法,运用main方法,创建对象,使用反射加载一个类,初始化类的子类优先加载父类。

        注意:当只使用类中静态常量时,类不会被初始化,因为在编译阶段就初始化了,当类在加载阶段初始化完成,才说明类的整个加载过程结果。

        三、类加载器分类

        真正实施类加载的具体实现者(事务)

        大致分两类:

        1.引导类加载器

        2.其他所有类加载器

        细致分类:

1 、引导类加载器(启动类加载器 BootStrap ClassLoader)

用 C/C++语言实现,嵌套在 JVM 内部。

Java中系统提供的类,都是由启动类加载器加载.例如:String。

只存放在JAVA_HOME>\lib 目录。

2 、扩展类加载器(Extension ClassLoader)

由 java 语言实现,独立存在于虚拟机外部。

由 sun.misc.Launcher$ExtClassLoader 实现.。派生于 ClassLoader 类。

jre/lib/ext子目录(扩展目录)下加载类库。

3、 应用程序类加载器(系统类加载器 Application ClassLoader)

由 java 语言实现,独立存在于虚拟机外部。

由 sun.misc.Launcher$ExtClassLoader 实现.。派生于 ClassLoader 类。

加载我们自己定义的类,用于加载用户类路径(classpath)上所有的类。

4、自定义类加载器

例如:我们自己写一个类继承ClassLoader。

例如:TomCat这种容器都会有自己加载类的加载器。

        四、双亲委派机制

        当加载一个类时,先让上一级的类加载器去加载;

        直到找到引用类加载器;

        如果上级类加载器找到了,就要上级类加载器的类;

        如果上级找不到,就逐级向下委托,使用子类加载器的类;

        如果找不到报异常。

        优点:安全,避免自己编写的类替换 Java的核心类,如 java.lang.String.

        五、打破双亲委派机制

        通过自定义类加载器,重写ClassLoader类中的findClass();从而打破双亲委派机制。

三、JVM运行时数据区

        一、运行时数据区组成概述

        按照不同的数据类型进行分区存储,分为五部分:程序计数器,虚拟机栈,本地方法栈,堆,方法区。

        二、程序计数器

        用来记录程序执行指令地址。

        特点: 

        内存小,速度快 ;

        线程私有(每个线程都有自己的程序计数器);

        生命周期同线程一致;

        不会出现内存溢出(JVM中唯一区域);

        不会有垃圾回收。

        三、Java虚拟机栈

        管理(Java自己写的)方法运行,调用方法入栈,运行完成出栈。

        栈是运行时单位,一个方法入栈后可以看作一个栈帧,一个栈帧表示一个方法。

        1、特点:

        栈是线程私有的,内存可能溢出,不会有垃圾回收,快速存储访问方式(仅慢于程序计数器)。

        2、栈帧构成:

        局部变量表:存储方法中定义的变量,参数;

        操作数栈:所有计算都借助操作数栈完成;

        方法返回地址:记录被调用方法位置(从哪里来,回哪里去);

        还有动态链接和一些附加信息。

        四、本地方法栈
        1、作用:

        用于管理本地方法的调用。

        本地方法就是系统库提供方法,用native关键字修饰。例如:

       hashCode();getClass();clone();notify();notifyAll();    wait();    read0();

start0();

       2、特点:

        线程私有,可能栈溢出,不会垃圾回收。

        JVM调优:调内存大小,选择垃圾回收器。

        五、Java堆内存

        存储程序中产生对象。

            1、特点:

        线程共享,可能内存溢出,会垃圾回收(垃圾回收的重点区域是堆),是JVM 管理中最大区域,堆内存大小可调节。

           2、堆内存区域划分:

         Eden:刚创建的对象存储区。

        Survivor:存放Eden和另一个幸存者区经垃圾回收后存活下来的对象,两个幸存者区交替使用,都比较小。

        OldGen:存储生命周期长的,非常大的,经过15次回收还存活的对象。

        3、分区原因:

        可根据不同存活时间进行划分,生命周期较长的对象,放在老年区,减少垃圾回收频率和扫描次数。

        4、对象创建内存分配过程

1.新创建的对象放在Eden区,但Eden区大小有限;

2.当垃圾回收时,将Eden区存活的对象移入Survivor0中;

3.继续运行,再创建对象还是保存在Eden区。

4.下一次垃圾回收时,将Eden区存活的对象与Survivor0区中存活对象放入Survivor1中,反复交替执行;

5.当一个对象经历过15次垃圾回收次数后 仍存活,那么就将此对象移入OldGen,在对象头中4个bit位用来记录回收次数,可设置回收次数,最大值为15。

老年代:新生代 = 2:1,Eden:Survivor0:Survivor1 = 8:1:1

5、堆空间的参数设置 

JVM调优是根据程序实际运行的需要设置的参数,调整各个区间比例大小。

垃圾回收名词:

        Minor GC:针对新生代进行垃圾回收(频繁回收YoungGen)

        Major GC:针对老年代进行垃圾回收(频繁回收OldGen)

        Full GC:整堆收集 实际开发中尽量避免整堆收集。(老年代不足或方法区空间不足 时触发整堆收集)

6、方法区

        主要用于存储加载到虚拟机的类信息 。

        特点:

        方法区大小可调节,线程共享,会垃圾回收。

        方法区垃圾回收条件苛刻,要同时满足三个条件:

        1、该类的所有对象和子类对象都不存在。

        2、加载该类的加载器不存在了。

        3、该类的Class对象不被其他地方引用。

因此认为一般情况下类是不会被卸载的。

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

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

相关文章

Oracle篇—参数文件在11gRAC或12cRAC的启动位置介绍

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…

LeetCode.2788. 按分隔符拆分字符串

题目 题目链接 分析 题目的意思是给我们一个字符串数组和一个分隔符,让我们按照分隔符把字符串数组分割成新的字符串数组。 看到这个描述,这不就是直接就是利用 按照分隔符分割字符串的系统库函数split(),这个函数的意思就是 把一个字符串…

ISA Server2006部署RuoYi无法登录的问题

ISA Server2006部署RuoYi无法正常登录。每次登录都会报错如下: 无效的会话,或者会话已过期,请重新登录。 原因分析 在nginx中部署没有问题,在ISA Server就会报这个错。根据登录的原理,我猜测可能是headr中的Author…

思迅商旗-loaddata-信息泄露-未公开Day漏洞复现

0x01阅读须知 本文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考。本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任&#…

浅析智能家居企业面临的组网问题及解决方案

在这个快速发展的时代,组网对于企业的发展来说是一个至关重要的环节。 案例背景: 案例企业是一家智能家居制造企业,在不同城市分布有分公司、店铺、工厂,这些点原本都是各自采购网络,与总部进行日常沟通、访问。 现在…

采集B站up主视频信息

一、网页信息(示例网址:https://space.bilibili.com/3493110839511225/video) 二、查看响应数据 三、查看数据包内容 四、相关代码(代码内容未进行翻页爬取) # Time: 2024/1/19 16:42 # Author: 马龙强 # File: 采集B…

【征服redis14】认真理解一致性Hash与Redis的三种集群

前面我们介绍了主从复制的方式和sentinel方式,这里我们看第三种模式-Cluster方式。 目录 1.前两种集群模式的特征与不足 2.Cluster模式 2.1 Cluster模式原理 2.2 数据分片与槽位 2.3 Cluster模式配置和实现 3.一致性Hash 3.1 哈希后取模 3.2 一致性Hash算法…

幻兽帕鲁开服教程——游戏

幻兽帕鲁开服教程——游戏 1. 安装服务器2. 服务器配置调整3. 运行环境Microsoft Visual C Runtime4. 加入服务器 这是研究开服时顺手写的笔记,也方便后来者。 如果你熟悉你所使用的操作系统的话,windows和linux应该区别不大。 1. 安装服务器 1.安装ste…

HarmonyOS应用开发的工程目录结构

在介绍鸿蒙应用开发的细节,我们来了解工程目录结构,这样我们才知道我们能做什么。 我们现在来一一介绍这些目录都是用来做什么的。 AppScope > app.json5 应用级的配置信息 AppScope > resources 这个目录下的base>element用于存放全局使用的…

跑分方面,这款 JavaScript 库在全球框架榜单中的表现比 React 要好得多

最初的动机 2021 年 11 月 左右,Strve 第一个版本发布,社区的反馈大部分是支持,也有少部分小伙伴提出了质疑,这都正常。你只要在社区发布一些作品,就必须接受其他人对你的作品的评价。 当初,开发 Strve 的…

循序渐进学 JavaScript <二>

续 <一> 九、JavaScript常见内置类 9.1 原始类型的包装类 基本数据类型也可以调用属性 在理论上来说它们是没有办法获取属性或者调用方法的 原始类型是简单的值&#xff0c;默认并不能调用属性和方法js 为了可以使其获取属性和调用方法&#xff0c;对其封装了对应的包装…

CTFhub-bak文件

CTFhub-Web-信息泄露-备份文件下载-bak文件 题目信息 解题过程 看到提示说和index.php有关&#xff0c;在url后面加index.php.bak&#xff0c;跳转到http://challenge-7a4da2076cfabae6.sandbox.ctfhub.com:10800/index.php.bak网址&#xff0c;即&#xff1a; 跳转到下载页…

清理docker 无用数据

df -h 查看 overlay 使用88% docker ps 我只要跑一个 把没有用的删除了去 让chatgpt 帮搞一搞 删除未使用的 Docker 镜像、容器、卷和网络&#xff0c;您可以按照以下步骤操作。请注意&#xff0c;在进行这些操作之前&#xff0c;确保您不再需要这些资源&#xff0c;因为删…

Elasticsearch的映射操作

本文来记录下Elasticsearch的映射操作 文章目录 映射的概述 映射的概述 Elasticsearch与mysql数据库对比 映射的概述 有了索引库&#xff0c;等于有了数据库中的 database。索引库(index)中的映射&#xff0c;类似于数据库(database)中的表结构(table)。创建数据库表需要设置字…

一文理解Python选择语句

在编程领域中&#xff0c;条件判断和选择是非常基础而且重要的一个部分。Python 作为一种被广泛应用的编程语言&#xff0c;提供了多种选择语句来满足不同的条件判断需求。本文将深入探讨 Python 中的选择语句&#xff0c;包括 if 语句、elif 语句、else 语句、简写的条件表达式…

有什么提高编程能力的书籍推荐吗?

数据密集型应用系统设计 原文完整版PDF&#xff1a;https://pan.quark.cn/s/d5a34151fee9 这本书的作者是少有的从工业界干到学术界的牛人&#xff0c;知识面广得惊人&#xff0c;也善于举一反三&#xff0c;知识之间互相关联&#xff0c;比如有个地方把读路径比作programming …

翻译: Anaconda 与 miniconda的区别

Anaconda 和 miniconda 是广泛用于数据科学的软件发行版&#xff0c;用于简化包管理和部署。 1. 主要有两个区别&#xff1a; packages包数量&#xff1a; Anaconda 附带了 150 多个数据科学包&#xff0c;而 miniconda 只有少数几个。Interface接口&#xff1a;Anaconda 有…

优先级队列(堆) PriorityQueue

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.优先级队列 2.优先级队列的模拟实现 2.1 堆的概念 2.2 堆的创建 2.3 堆的插入和删除 2.…

MySQL(视图,存储函数,存储过程)

作业1&#xff1a; 作业实现&#xff1a; 首先创建学生表&#xff0c;课程表&#xff0c;以及学生选课表。 CREATE TABLE Student (Sno INT PRIMARY KEY,Sname VARCHAR(20) NOT NULL,Ssex CHAR(1) CHECK (Ssex IN (男, 女)),Sage INT,SDept VARCHAR(20) DEFAULT 计算机 );CRE…

4. seaborn-线性关系可视化

Seaborn本身并不是为了统计分析而生的&#xff0c;seaborn中的回归图主要用于添加视觉指南&#xff0c;以帮助在探索性数据分析EDA中强调存在于数据集的模式。 import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warningssns.set(stylewhiteg…