JVM的相关知识

一.JVM内存区域划分(JVM是一个Java进程)

  一个进程运行过程中就需要重操作系统这里申请到一些内存资源

JVM也是如此,搞一大块内存,供Java代码执行时使用

JVM把这一大块内存又划分成不同的区域,分别代表不同的用途

  各个部分的存储内容:

  栈:局部变量,方法的调用关系(如:递归)

  堆:new出来的对象里面的属性

  方法区:类对象,static成员,类被加载到内存后放的地方,方法的内容

  程序计数器:记录了当前线程执行下一个指令的内存地址

如:

  public class Test{

   public   int n=20;

   public static int a=10;

public static void main(String[]args){

Test t=new Test();

}

}

这里的的t是局部变量放在栈上

              n是new出来的内容放到堆上

              a是static成员放在方法区

误区:变量在哪里,和是不是“基本类型”,是否是“引用类型”没有关系

二、JVM类加载机制(把一个硬盘文件加载到内存中)

最开始写的.java文件,把它编译成.class文件(字节码)

运行.java程序,JVM会读取.class文件,把文件的内容放到内存中,就会构成一个.class对象

类健在的流程:

1.加载:找到.class文件,打开.class文件,读取.class文件的内容,并尝试解析格式

2.验证:检查一下当前.class文件的格式,是否符合要求

3.准备:给类对象分配内存

最终目标是构造成完整的内对象,分配内存+初始化

分配出来的内存空间,内容是0的值(此时此刻,类对象上的static成员也就是0)

4.解析:主要是初始化类对象中涉及到的一些字符串常量(其实字符串常量已经在.class文件中了,直接读到内存中就行了)

这里用符号引用替换直接引用的过程(符号5引用:此时.class文件中,不知道字符串真实的内存地址是哪里的,只能知道一个相对位置的偏移量,知道字符串的内容在.class文件的那个地方;等到把字符串内容加载到内存之后,就可以把真实的地址写换到刚才的符号引用这里了)

5.初始化:对类对象进行更具体的初始化操作,初始化静态成员,执行静态代码块,加载父类

三、双亲委派模型(描述加载构成中,如何找.class文件)

Bootstrap ClassLoader(负责加载JVM准库中的类):Java有一个标准文档,描述了都要提供哪些类

Extension  ClassLoader(负责加载JVM扩展的类):除了标准库之外,实现JVM的厂商,可能还会添加一些类

Application  ClassLoader(负责加载第三方库):像MySQL,jdbc等一下放在Maven中的依赖

双亲委派模型,就描述了类加载的流程:

1.从Application ClassLoader开始。不会立即搜索第三方库,而是先把任务委派给父亲,让父亲尝试加载

2.接着到了Extension  ClassLoader,它也不会立即搜索JVM扩展的类,而是把任务委派给他的父亲,让他的父亲尝试加载

3.接着到了Bootstrap ClassLoader,它也是把任务委派给自己的父亲,但是他没有父亲,那么他就自己搜索类了。

如果自己找到了这个类,就会进行后续的加载(也就和Extension、Application没有什么关系了)

如果没有找到这个类任务就会交给孩子

4、任务回到Extension  ClassLoader,就要搜索扩展库中的目录,看有没有匹配的.class文件

如果有的话,就进行后续加载也就和Application没有什么关系了

5、任务回到了Application ClassLoader,就要搜索第三方库的目录(往往是项目目录,以及和JVM的一些配置项有关-classpath有关系)

如果找到了类,就会进行后续加载

如果没有找到就会抛出一个异常

一个类什么时机会被加载?(懒汉模式用到了才加载)

1、构造类的实力

2、使用了类的静态方法/静态属性

3、子类的加载会触发父类

类加载了之后,后续使用就不必加载了(类对象已经是现成了的)

注:类卸载(把类对象干掉)

特殊情况:

一般来说类加载了之后,就不必考虑卸载了,一直保持到程序运行结束

有些特定的场景需要用到类卸载操作

有的服务器需要打“热补丁”代码有bug,正常操作应该是修改代码,重新编译,用新的版本代替就得版本,重启服务器

有些特殊情况,服务器不方便重启,就可以“打补丁”,通过一些特殊手段,把书序替换的类给卸载掉,直接用加载好的心得类替换(新版代码)(Java这里用的倒不是很多,Java的服务器一般都是分布式系统,天然就可以方便重启的)

不重启服务器,也能更新代码

“热”不需要重启,不需要重新编译,也不需要重启

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

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

相关文章

Qt 5桌面APP开发实战

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 第一节:Qt 5桌面APP开发实战入门 Qt 5的跨平台特性 Qt 5的界面设计工具 Qt 5的…

Java基础语法规范

语法规范 public class HelloWorld{ //类名: 1. 首字母要大写 2. 源文件名与类名相同// 单行注释/* 多行注释除这两个之外还有文档注释。不重要* /public static void main (String[] args){ /* 1. main()⽅法是类体中的主⽅法,该⽅法从{开始到}结束…

商用未来何时来?软银揭示量子计算商业应用现状

内容来源:量子前哨(ID:Qforepost) 文丨沛贤/浪味仙 排版丨沛贤 深度好文:3000字丨10分钟阅读 摘要:软银(SoftBank)先进技术研究所正在积极推进量子计算商业应用,借助与…

在CentOS 8上卸载与安装MySQL 8的详细步骤

关键词:MySQL 8安装、CentOS 8、YUM源配置、卸载MySQL、MySQL残留文件删除、首次登录MySQL临时密码、服务状态检查、MySQL社区服务器 阅读建议:本文适合需要在CentOS 8操作系统上部署最新MySQL 8数据库的系统管理员或开发者阅读。文中步骤简洁清晰&#…

SpringBoot-世界杯足球赛网站-28567

Springboot世界杯足球赛网站 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对世界杯足球赛…

Pipecat: 创建语音对话agent的开源框架,支持多模态!

项目简介 pipecat 是用于构建语音(和多模态)对话代理的框架。诸如私人教练、会议助理、儿童讲故事玩具、客户支持机器人、摄入流程和尖刻的社交伙伴。 看看一些示例应用: 语音代理入门 您可以开始在本地计算机上运行 Pipecat,然…

Vue 菜单组件开发教程

在 Vue 项目中&#xff0c;我们常常需要构建各种菜单结构。下面就来详细介绍如何基于给定的代码来开发一个菜单组件。 组件部分 一、模板部分 <template> <template v-for"item in menuTree" :key"item._id"> <el-sub-menu v-if"i…

xss漏洞学习(题解)

1.简单知识点回顾 XSS允许恶意web用户将代码植入到提供给其它用户使用的页面中。 特点&#xff1a;能注入恶意的HTML/JavaScript代码到用户浏览器网址上&#xff0c;从而劫持会话 类型&#xff1a; DOM型&#xff1a;属于反射型的一种&#xff0c;利用非法输入来闭合对应的h…

胶原蛋白真的可以改善皮肤?

一、胶原蛋白与皮肤的关系 胶原蛋白&#xff0c;被誉为“骨中之骨&#xff0c;肤中之肤&#xff0c;肉中之肉”&#xff0c;是皮肤的重要组成部分。随着年龄的增长&#xff0c;人体内的胶原蛋白会逐渐流失&#xff0c;导致皮肤出现松弛、干燥、皱纹等问题。因此&#xff0c;补…

计算机tcp/ip网络通信过程

目录 &#xff08;1&#xff09;同一网段两台计算机通信过程 &#xff08;2&#xff09;不同网段的两台计算机通信过程 &#xff08;3&#xff09;目的主机收到数据包后的解包过程 &#xff08;1&#xff09;同一网段两台计算机通信过程 如果两台计算机在同一个局域网中的同…

便溏平衡的乐章:肾合指引出汗与便溏的微妙对话

平衡的乐章&#xff1a;肾合指引出汗与便溏的微妙对话 在人体的舞台上&#xff0c;汗水与大便扮演着不可或缺的角色。然而&#xff0c;当汗水如瀑布般倾泻&#xff0c;大便却变得稀软不成形&#xff0c;这背后或许隐藏着阳虚的密码。本文将带你探索这其中的奥秘&#xff0c;揭…

一个案例告诉你,MySQL如何查询今天、昨天、近7天、近30天、本月、上个月、本季度、上季度、本年、上一年数据

参考博客 mysql查询当天/昨天/近7天/近30天/本月/上个月/本季度/上季度/本年/上一年 数据 正文内容 创建测试案例&#xff08;也可直接使用附录MySQL脚本生成数据&#xff09; 1、新建测试表 CREATE TABLE example (id INT AUTO_INCREMENT PRIMARY KEY,date_column DATE,d…

C/C++开发,opencv-objdetect模块,CascadeClassifier人脸识别应用

目录 一、CascadeClassifier应用简介 1.1 objdetect模块 1.2 CascadeClassifier类 1.3 detectMultiScale函数详解 二、CascadeClassifier应用示例 2.1 模型及图片下载准备 2.2 程序代码 2.3 程序编译及运行 一、CascadeClassifier应用简介 1.1 objdetect模块 在OpenCV…

如何识别并选择正规、优质的外汇交易平台?

外汇市场的日益繁荣吸引了越来越多的投资者&#xff0c;但同时也带来了众多外汇平台的涌现。如何在这些平台中筛选出正规、可信的平台&#xff0c;成为了每位外汇交易者必须面对的首要问题。以下&#xff0c;我们将为您揭示如何鉴别外汇平台真伪的几个关键方法&#xff1a; 首先…

7个卖出信号出现,昂首资本立即盈利收场

在上篇文章中&#xff0c;我们和各位投资者讨论了如果使用匕首交易策略进行交易&#xff0c;但是如果只买进不卖出&#xff0c;是不是还是盈利不了&#xff1f;Anzo Capital昂首资本认为只有低买高卖才能盈利赚钱&#xff0c;只要发现盈利信号就要立即卖出盈利收场&#xff01;…

HTTP/超文本传输协议(Hypertext Transfer Protocol)及HTTP协议通信步骤介绍和请求、响应阶段详解;

目录 一、HTTP/超文本传输协议 特点和功能 请求-响应模型 版本和扩展 安全性和加密 二、HTTP协议通信步骤介绍 三、请求、响应阶段详解 HTTP请求 HTTP响应 示例 一、HTTP/超文本传输协议 HTTP/超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff09;是…

Spring Cache自定义序列化解决乱码问题

Spring Cache数据缓存到 Redis中的 value是乱码问题&#xff08;包含日期格式转换&#xff09;&#xff0c;主要是因为序列化方式导致的。 Spring Cache使用 Redis缓存管理器时&#xff0c;默认 value使用的是 JDK序列化值的方式&#xff0c;所以导致缓存的 value乱码的问题。 …

Java八股文面试全套真题

Java八股文面试全套真题 一、Redis1.1、你在最近的项目中哪些场景使用了redis呢&#xff1f;1.2、缓存穿透1.3、布隆过滤器1.4、缓存击穿1.5、缓存雪崩1.6、redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;&#xff08;双写一致性&#xff09;1.6.1、读…

nginx与nginx-rtmp-module安装

nginx与nginx-rtmp-module安装 画了好几天图&#xff0c;实在有些乏力&#xff0c;找点有意思的事情做做 觉得视频流传输挺有意思&#xff0c;B站找了些视频&#xff0c;但感觉有些大同小异&#xff0c;讲得不是很清楚 FFmpeg/RTMP/webRTC丨90分钟搞定直播逻辑-推流-流媒体服…

君子签打造“签+存+管”一体化签署平台,助推信创数字化改造

近年来&#xff0c;在国家信创战略的引导下&#xff0c;在建设数字中国、网络安全强国、推动产业升级等背景下&#xff0c;中国信创产业规模持续扩大&#xff0c;展现出前所未有的活力。根据艾媒咨询市场调研&#xff0c;2023年中国信创产业规模将达20961.9亿元&#xff0c;202…