JVM深入学习(一)

目录

一.JVM概述 

1.1 为什么要学jvm?

1.2 jvm的作用 

1.3 jvm内部构造

二.JVM类加载

2.1类加载过程

2.2类加载器

2.3类加载器的分类

2.4双亲委派机制

 三.运行时数据区

堆空间区域划分(堆)

为什么分区(代)?(堆)

对象创建存储过程(堆)

jvm调优

方法区的垃圾回收(方法区)


一.JVM概述 

1.1 为什么要学jvm?

         1.面试的需要。 

         2.高级程序员需要了解 。

1.2 jvm的作用 

        jvm负责把编译后的字节码转缓缓为机器码。

1.3 jvm内部构造

类加载部分负责把硬盘上的字节码加载到内存中(运行时数据区)。
运行时数据区负责存储运行时产生的各种数据,类信息,对象信息,方法信息...
执行引擎负责将字节码转为机器码。
本地方法接口

调用本地方法。

Object类中的hashCode()--对象内存中的地址。

read0()方法调用操作系统,操作系统返回数据。

 垃圾回收

 使用引用计数法或可达性分析法来判断对象是否存活。

二.JVM类加载

类加载系统:负责将硬盘上的字节码文件加载到jvm中,生成类的Class对象,存储在方法区。 

2.1类加载过程

        1.加载:以二进制文件流进行读取 ,在内存中为类生成Class对象。

        2.链接:

                验证:验证文件格式是否正确,字节码文件都以(CAFEBABE标识开头)

                准备:为类的静态属性分配内存,并进行初始化赋值(不包含final修饰的)如:static int n=123;准备阶段先赋值默认0,初始化阶段时赋值123。

                注意:不包含用 final 修饰的 static 常量,在编译时进行初始化。

                 解析:将类中的符号引用替换为直接引用(把字节码的符号引用替换成内存中的直接引用)

3.初始化:(类加载完成的标志)

        初始化阶段主要是为类中静态成员进行赋值

        因为类加载执行完初始化,才说明类加载完成了。

类在哪些情况下会被加载

        1.调用类中的静态成员(变量(不是final修饰的常量),方法)

        2.new类的对象

        3.在类中执行main方法

        4.反射加载类(Class.forName()生成的class对象)

        5.子类被加载

类在以下两种情况下,是不会被加载的

1. 类作为数组类型
Demo demo[] = new Demo[10]; //new 的数组对象   不是Demo对象,Demo只是作为类型存在

2.只是访问类中的静态的常量
System.out.println(Demo.P);//优化   不加载整个类了,  只获取到用到的静态常量

2.2类加载器

        类加载器就是实际负责读取类的功能.

        类加载器分类: 站在jvm的角度上, 分为

        1.引导类加载器(不是用java写的,是用c/c++),负责读取加载java中底层系统库

        2.java写的类加载器(用来读取我们写的应用程序)

 输出为null,说明为引导类加载器写的,能输出则为java写的。

2.3类加载器的分类

再细分类加载器:

        1.启动类加载器

C/C++语言实现,负责加载java核心类库(系统库,java.lang)

        2. 扩展类加载器 

java语言实现,继承ClassLoader类,加载jre包下面的扩展类的jre/lib/ext子目录

        3.应用程序类加载器

用Java语言实现,继承ClassLoader类,用来加载我们自己的应用程序类

2.4双亲委派机制

        当加载一个类时,总是先让他的父级类加载器去加载,确保把系统中类优先加载,直到父类加载器找不到类时, 再逐级向下,让子级类加载器加载,如果子级也找不到, 最终抛类找不到异常。这就是双亲委派机制。

为什么这样做?

防止我们自己写的类替换了系统中的类(如:String类)

如何打破双亲委派机制?

自定义类加载器:MyClassLoader extends ClassLoader  

重写findClass()

 三.运行时数据区

        存储运行时产生的各种数据

程序计数器        用来记录每一个线程执行的指令位置,速度最快,是线程私有(每个线程都会有一个程序计数器),此区域不会出现内存溢出(不够用),也不会出现垃圾回收。
虚拟机栈

栈是运行的,解决程序方法执行。

在虚拟机中,运行我们java自己写的方法

调用方法时,方法入栈,运行结束出栈 (先进后出 栈顶的方法,称为当前栈帧)

一个方法就是一个栈帧,,在栈帧中存储局部变量,运行结果....

虚拟机栈也是线程私有的,线程之间互相隔离

栈区域不存在垃圾回收, 但是会存在内存溢出问题。

栈帧中存储内容:1.局部变量表 int a =10;    2.操作数栈 (计算过程) int c = a+b;

3.方法返回地址

本地方法栈

        是用来执行调用的本地方法的,是线程私有的,不会存在垃圾回收,会出现内存溢出问题。

堆的作用是用来存储java语言产生的对象的。

是运行时数据区中最大的一块内存空间, 空间大小可以设置。

堆空间是所有线程共享的。

堆空间是垃圾回收(没有用的垃圾对象,有周期性)的重点区域, 堆中没有被使用到的垃圾对象,会被垃圾回收器回收掉。有可能出现内存溢出。

方法区

方法区主要用来存储加载类的信息。

方法区的大小也是可以设置的。

方法区也会进行垃圾回收, 方法区也可能会出现内存溢出问题。

堆空间区域划分(堆)

堆分为:新生区(新生代/年轻代):伊甸园区、幸存者0区、幸存者1区

              老年区(老年代)

为什么分区(代)?(堆)

        可以将不同生命周期的对象存储在不同的区域,不同的区域采用不同的垃圾回收算法,使垃圾回收策略更加优化。

对象创建存储过程(堆)

新创建的对象都存储在伊甸园区。(如上述的图)

当垃圾回收时,将还被使用的对象,转移至某一个幸存者区,将伊甸园区垃圾对象进行清除。

当下次垃圾回收时,将伊甸园区存活的对象与当前正在使用的幸存者区存活的对象转移到另一个幸存者区(每次空闲一个幸存者区)。

当一个对象经历过15次垃圾回收后,仍然存活,那么就把该对象移动到老年代。

对老年代比较少的进行垃圾回收,在老年代空间不足时,对老年代会进行垃圾回收。

当回收后,内存仍然不足时,会出现FULL GC(整堆收集 应尽量避免)。

当整堆收集后仍然不够使用,那么就会出现内存溢出错误 --- OOM(OutOfMemoryError)

jvm调优

        可以根据程序具体的使用场景, 对运行时数据区的各种空间大小进行调整 例如:堆,方法区

②对垃圾回收器进行选择

方法区的垃圾回收(方法区)

        方法区的垃圾回收, 是对类信息进行回收的。

        类信息如果不再被使用,类信息也可以被卸载。

卸载条件:①该类所产生的对象都不存在了。

                  ②该类的Class对象,也不再被使用了。

                  ③ 加载该类的类加载器也被回收了。

 感谢你的阅读与关注,如有问题欢迎探讨!💓

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

o1 医学推理:基于推断时长扩展与旅程学习,仅用 500 条蒸馏示例,实现 6%~11% 性能提升

o1 医学推理:基于推断时长扩展与旅程学习,仅用 500 条蒸馏示例,实现 6%~11% 性能提升 论文大纲1. 提出背景是什么?2. 概念的性质是什么?是什么导致这个性质?3. 请举一个正例、一个反例&#xff…

微信小程序隐藏右侧胶囊按钮,分享和关闭即右侧三个点和小圆圈按钮

在微信小程序开发过程中,可能需要将右侧的胶囊按钮、即右侧的三个点和小圆圈按钮关闭掉。如图: 这时,我们只需在该页面的json文件中进行相关配置即可 {"navigationBarTitleText": "商品详情页","navigationStyle&q…

chrome小插件:长图片等分切割

前置条件: 安装有chrome谷歌浏览器的电脑 使用步骤: 1.打开chrome扩展插件 2.点击管理扩展程序 3.加载已解压的扩展程序 4.选择对应文件夹 5.成功后会出现一个扩展小程序 6.点击对应小程序 7.选择图片进行切割,切割完成后会自动保存 代码…

检测到联想鼠标自动调出运行窗口,鼠标自己作为键盘操作

联想鼠标会自动时不时的调用“运行”窗口 然后鼠标自己作为键盘输入 然后打开这个网页 (不是点击了什么鼠标外加按键,这个鼠标除了左右和中间滚轮,没有其他按键了)

深入MapReduce——计算模型设计

引入 通过引入篇,我们可以总结,MapReduce针对海量数据计算核心痛点的解法如下: 统一编程模型,降低用户使用门槛分而治之,利用了并行处理提高计算效率移动计算,减少硬件瓶颈的限制 优秀的设计&#xff0c…

【大数据】机器学习----------强化学习机器学习阶段尾声

一、强化学习的基本概念 注: 圈图与折线图引用知乎博主斜杠青年 1. 任务与奖赏 任务:强化学习的目标是让智能体(agent)在一个环境(environment)中采取一系列行动(actions)以完成一个…

Android中Service在新进程中的启动流程

目录 1、Service与AMS交互框架介绍 1.1、认识AMS代表IActivityManager 1.2、认识客户端代表IApplicationThread 2、Service启动流程概览 我们知道Android有四大组件,Activity、Service、ContentProvider、Broadcast,每个组件在系统运行中或者我们编写…

华为EC6110T-海思Hi3798MV310_安卓9.0_通刷-强刷固件包

华为EC6110T-海思Hi3798MV310_安卓9.0_通刷-强刷固件包 刷机教程说明: 适用机型:华为EC6110-T、华为EC6110-U、华为EC6110-M 破解总分为两个部分:拆机短接破解(保留IPTV)和OTT卡刷(不保留IPTV&#xff09…

2025.1.20——二、buuctf BUU UPLOAD COURSE 1 1 文件上传

题目来源:buuctf BUU UPLOAD COURSE 1 1 目录 一、打开靶机,查看信息 二、解题思路 step 1:上传一句话木马.php文件康康回显 step 2:蚁剑连接 三、小结 一、打开靶机,查看信息 这里提示到了文件会被上传到./uplo…

移动端VR处理器和传统显卡的不同

骁龙 XR 系列芯片 更多地依赖 AI 技术 来优化渲染过程,而传统的 GPU 渲染 则倾向于在低画质下运行以减少负载。这种设计是为了在有限的硬件资源下(如移动端 XR 设备)实现高性能和低功耗的平衡。以下是具体的分析: 1. AI 驱动的渲染…

[java] java基础-字符串篇

目录 API String 创建字符串对象的两种方式: Java的内存模型 字符串常量池(串池)存放地址 两种构造方法的内存分析 String的常用方法 号比较的是什么 字符串比较(比较字符串的数据值) 遍历字符串 StringBui…

C# 多线程同步(Mutex | Semaphore)

Mutex: 用于保护临界区,确保同一时间只有一个线程能够访问共享资源; Semaphore: 允许同时有多个线程访问共享资源,但会限制并发访问的数量。 Mutex运行输出 Semaphore运行输出 namespace SyncThreadDemo {internal class Program{static stri…

易语言模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

ThinkPhp伪静态设置后,访问静态资源也提示找不到Controller

ThinkPhp没有配置伪静态时,除了默认的IndexController能访问,其他路由Controller都访问不到,提示404错误。配置了伪静态后就解决了这个问题。 但是当我的ThinkPhp后台项目中有静态资源放在public目录(或子目录)中需要…

C#编译报错: error CS1069: 未能在命名空间“System.Windows.Markup”中找到类型名“IComponentConnector”

文章目录 问题现象解决方案 问题现象 一个以前使用.NET Framwork 3.0框架开发的项目,在框架升级到.NET Framwork 4.7.2后, 如下代码: #pragma checksum "..\..\XpsViewer.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}&qu…

在宝塔安装部署mindoc

MinDoc简介 MinDoc 是一款针对IT团队开发的简单好用的文档管理系统。 MinDoc 的前身是 SmartWiki 文档系统。SmartWiki 是基于 PHP 框架 laravel 开发的一款文档管理系统。因 PHP 的部署对普通用户来说太复杂,所以改用 Golang 开发。可以方便用户部署和实用。 开…

2025寒假备战蓝桥杯01---朴素二分查找的学习

文章目录 1.暴力方法的引入2.暴力解法的思考 与改进3.朴素二分查找的引入4.朴素二分查找的流程5.朴素二分查找的细节6.朴素二分查找的题目 1.暴力方法的引入 对于下面的这个有序的数据元素的组合,我们的暴力解法就是挨个进行遍历操作,一直找到和我们的这…

计算机毕业设计hadoop+spark+hive图书推荐系统 豆瓣图书数据分析可视化大屏 豆瓣图书爬虫 知识图谱 图书大数据 大数据毕业设计 机器学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例

如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 防火墙在运维工作中有着不可或缺的重要性。首先,它是保障网络安全的关键防线,通过设置访问控制规则,可精准过滤非法网络流量,有效阻挡外部黑客攻击、恶…

微服务学习-Nacos 注册中心实战

1. 注册中心的设计思路 1.1. 微服务为什么会用到注册中心? 服务与服务之间调用需要有服务发现功能;例如订单服务调用库存服务,库存服务如果有多个,订单服务到底调用那个库存服务呢(负载均衡器)&#xff0…