当前位置: 首页 > news >正文

初步了解JVM

JVM

整体组成部分

类加载器

类加载过程

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

链接(验证,准备,解析)

​ 验证:对字节码文件格式进行验证,文件是否被污染,对基本的语法格式进行验证

​ 准备:为静态的变量进行内存分配,赋值为默认值(静态的常量在编译期间就进行初始化)

​ 解析:将符号引用转为直接引用,将字节码中的表现形式转为内存中表现(内存地址)

初始化

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

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

1.在类中运行main方法

2.创建对象

3.使用类中静态常量、静态方法

4.使用反射

5.初始化它的子类

以下两种情况不会被初始化:

1.使用编译期间被赋值的静态常量

2.作为数组类型

作用

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

启动类加载器

Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。是由c/c++编写的,与Java语言无关

扩展类加载器

ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。

是由Java语言编写的

应用程序类加载器

AppClassLoader:主要负责加载程序中自己开发的类

public class ClassLosderTest {public static void main(String[] args) {//启动类加载器ClassLoader a = new String("a").getClass().getClassLoader();System.out.println(a);ClassLoader classLoader = new ClassLosderTest().getClass().getClassLoader();//应用程序类加载器sun.misc.Launcher$AppClassLoader@18b4aac2System.out.println(classLoader);//扩展类加载器 sun.misc.Launcher$ExtClassLoader@1b6d3586System.out.println(classLoader.getParent());System.out.println(classLoader.getParent().getParent());}
}

测试结果:

null
sun.misc.Launcher A p p C l a s s L o a d e r @ 18 b 4 a a c 2 s u n . m i s c . L a u n c h e r AppClassLoader@18b4aac2 sun.misc.Launcher AppClassLoader@18b4aac2sun.misc.LauncherExtClassLoader@1b6d3586
null

运行时数据区

程序计数器是不会产生内存溢出的

堆和方法区是线程共享的,是会出现垃圾回收的

程序计数器,本地方法栈,Java栈是线程私有的

堆,方法区,本地方法栈,Java栈是可以进行内存大小设置的

堆,方法区,本地方法栈,Java栈是会出现内存溢出的

Java栈(stack)

基本作用特征:

栈是运行单位,用来管理方法的调用运行,是用来运行Java方法的区域,可能会出现栈溢出,是线程私有的

运行原理:

是先进先出的结构,最顶部的称为当前栈帧

栈帧结构:

局部变量表(存储方法中声明的变量)

操作数栈(实际计算运行)

动态链接

方法返回地址

堆(heap)

基本作用特征

一个jvm只有一个堆,是线程共享的,堆内存的大小是可以调节的,是用来存储对象的,是内存空间最大的区域,本区域是存在垃圾回收的

堆空间的分区

新生区

(伊甸园区,幸存0区,幸存1区)

永久区

为什么要分区

针对于不同的区,可以使用不同的垃圾回收算法,频繁回收新生代,较少回收老年代

创建对象,垃圾回收的过程

1.新创建的对象,都存储在伊甸园区

2.当垃圾回收时,将伊甸园区中的垃圾对象直接销毁,将幸存下来的对象转移到幸存0区

3.当再次进行垃圾回收时,将伊甸园区的幸存对象和幸存0区中的对象转移到幸存一区,每次保证一个幸存者区为空

4.每次垃圾回收时,幸存下来的对象都会记录幸存次数,当一个对象经历15次垃圾回收仍然幸存下来就会被移动到老年区

5.老年区垃圾回收次数较少,当内存空间不够用时,才会进行回收老年区。

堆空间的配置比例

新生区和老年区内存占比默认为1:2

伊甸园区:幸存0区:幸存1区=8:1:1(默认)

分代收集思想

Minnor GC 新生区收集,经常发生

Major GC 老年区收集,较少发生

整堆收集 对整个堆以及方法区进行收集(发生情况:老年区空间不足,方法区空间不足,System.gc())

字符串常量池

在JDK7之前位于方法区,7之后位于堆空间中,因为方法区的收集是在整堆收集时发生,频率较低

方法区(method area)

静态变量,常量,类信息(构造方法,接口),运行时的常量池(类中各个元素的编号)

(static final Class 常量池)

特点

jvm启动时创建,大小可以调整,是线程共享的,会有内存溢出问题

方法区的垃圾回收

在full GC时发生,主要是回收类信息,发生的条件比较苛刻,满足以下三点即可:

1.在堆中该类的对象以及子类的对象不存在

2.该类的类加载器不存在

3.该类的Class对象不存在

程序计数器(program counter register)

每个线程都有一个程序计数器,是线程私有的,是一个非常小的内存空间,几乎可以忽略不计,是用来记录每个线程运行的指令位置,是运行时数据区唯一不会内存溢出的一块空间,运行速度最快

本地方法栈(native method stack)

每个线程私有,用来运行本地方法的区域,空间大小可以调整,可能会出现栈溢出

执行引擎

作用

将加载到内存的字节码编译/解释为不同平台的机器码
.java文件----编译—>.class文件 是在开发期间,由jdk提供的编译器(javac)进行源码编译(前端编译)

.class文件----解释/编译—>机器码 后端编译,在运行时,由执行引擎完成

解释器和编译器结合

解释器:将字节码逐行进行解释执行,效率低

编译器(JIT):将字节码编译,并且在方法区中缓存起来,执行更高效,不会立即使用编译器(将一些频繁执行的热点代码进行编译)

程序启动后,先使用解释器立即执行,省去了编译时间

程序运行一段时间后,对热点代码进行编译缓存,为了后续提高效率

本地方法接口

什么是本地方法

凡是带了native关键字的,说明Java的作用范围达不到,会去调用本地方法接口,没有方法体(例如 hashCode() new thread().start())

为什么要用本地方法

JAVA语言需要和外部的环境进行交互(例如需要访问内存硬盘其他硬件设备),直接访问操作系统的接口即可

jvm中的一些机制

双亲委派机制

内容

当需要记载一个类时,当前加载器不会先进行加载,会向上委托父类加载器进行加载,一直到启动类加载器,如果启动类加载器无法加载,就会通知子类进行加载,一直到应用程序类加载器,最终如果都没有找到,就会抛出classnotfound异常

优点

安全性较高,防止核心类库被修改,避免了类的重复加载

如何打破双亲委派机制

创建自己的类加载器继承ClassLoader类,并且重写里面的loadClass/findClass方法。

例如:Tomcat使用自己的类加载器来加载类

垃圾回收

什么样的对象是垃圾

在运行过程中,没有被任何引用指向的对象成为垃圾对象

为什么需要GC

如果不及时清理垃圾的话,可能会出现内存溢出问题,在回收时还可以将内存碎片进行整理

内存溢出和内存泄漏

内存溢出:经过垃圾回收后,还是无法存储新创建的对象,内存不够用就是内存溢出

内存泄漏:一些不用的对象但是jvm无法判定为垃圾,不能进行垃圾回收,默默占用内存这样的叫内存泄漏(IO流close jdbc close)

垃圾回收算法

标记阶段

作用: 判断对象是否是垃圾对象, 是否有引用指向对象.

相关的标记算法: :引用计数算法和可达性分析算法

引用计数算法(在现代的jvm中并没有被使用).

有个计数器来记录对象的引用数量

String s1 = new String("aaa");
String s2 = s1;  //有两个引用变量指向aaa对象
s2 = null; -1
s1 = null; -1

缺点:

需要维护计数器,占用空间,频繁操作需要事件开销

无法解决循环引用问题. 多个对象之间相互引用,没有其他外部引用指向他们,计数器都不为0,不能回收,产生内存泄漏.

可达性分析算法/根搜索算法

实现思路: 从一些为根对象(GCRoots)的对象出发去查找,与根据对象直接或间接连接的对象就是存活对象,不与根对象引用链连接的对象就是垃圾对象.

GC Roots 可以是哪些元素?

在虚拟机栈中被使用的.

在方法中存储的静态成员指向的对象

作为同步锁使用的 synchronized

在虚拟机内部使用的对象

对象的 finalization 机制

当一个对象被标记为垃圾后,在真正被回收之前,会调用一次Object类中finalize(). 是否还有逻辑需要进行处理.

自己不要在程序中调用finalize(),留给垃圾回收器调用.

有了finalization机制的存在,在虚拟机中把对象状态分为3种:

1.可触及的 不是垃圾,与根对象连接的

2.可复活的 判定为垃圾了,但是还没有调用finalize(),(在finalize()中对象可能会复活)

3.不可触及的: 判定为垃圾了,finalize()也被执行过了,这种就是必须被回收的对象

垃圾回收阶段的算法

标记–复制算法:

将内存分为大小相等的两份空间, 把当前使用的空间中存活的对象 复制到另一个空间中, 将正在使用的空间中垃圾对象清除.

优点: 减少内存碎片

缺点: 如果需要复制的对象数量多,效率低.

适用场景: 存活对象少 新生代适合使用标记复制算法

标记-清除算法

清除不是真正的把垃圾对象清除掉,

将垃圾对象地址维护到一个空闲列表中,后面有新对象到来时,覆盖掉垃圾对象即可.

特点:

​ 实现简单

​ 效率低,回收后有碎片产生

标记-压缩算法(标记-整理)

垃圾回收器

垃圾收集器是垃圾回收的实际实现者,垃圾回收算法是方法论.

垃圾回收器分类

按照线程数量

单线程垃圾回收器

Serial

Serial old

多线程垃圾回收器

Parallel

按照工作模式分为

独占式: 垃圾回收线程执行时,其他线程暂停

并行式: 垃圾回收线程可以和用户线程同时执行

按工作的内存区间

年轻代垃圾回收器

老年代垃圾回收器

垃圾回收器性能指标

暂停时间

吞吐量

回收的速度

占用内存大小

CMS垃圾回收器

Concurrent Mark Sweep 并发标记清除

支持垃圾回收线程与用户线程并发(同时)执行

初始标记: 独占式的暂停用户线程

并发标记: 垃圾回收线程与用户线程并发(同时)执行

重新标记: 独占式的暂停用户线程

并发清除: 垃圾回收线程与用户线程并发(同时)执行 进行垃圾对象的清除

优点: 可以作到并发收集

弊端: 使用标记清除算法,会产生内存碎片, 并发执行影响到用户线程,无法处理浮动垃圾

三色标记

​ 由于cms有并发执行过程,所以在标记垃圾对象时有不确定性.

​ 所以在标记时,将对象分为3种颜色(3种状态)

​ 黑色: 例如GCRoots 确定是存活的对象

​ 灰色: 在黑色对象中关联的对象,其中还有未扫描完的, 之后还需要再次进行扫描

​ 白色: 与黑色,灰色对象无关联的, 垃圾收集算法不可达的对象

标记过程:

1.先确立GCRoots, 把GCRoots标记为黑色

2.与GCRoots关联的对象标记为灰色

3.再次遍历灰色,灰色变为黑色,灰色下面有关联的对象,关联的对象变为灰色

4.最终保留黑色,灰色, 回收白色对象

可能会出现漏标,错标问题

G1(Garbage-First) 垃圾优先

将堆内存各个区又分成较小的多个区域, 对这些个区域进行监测,对某个区域中垃圾数量大的区域优先回收.也是并发收集的.

相关文章:

初步了解JVM

JVM 整体组成部分 类加载器 类加载过程 加载:使用IO读取字节码文件,转换并存储,为每个类创建一个Class对象,存储在方法区中 链接(验证,准备,解析) ​ 验证:对字节码文件格式进…...

嘀嗒陪诊小程序v1.0.8+小程序前端

嘀嗒陪诊小程序功能相对简单,后台也简捷,如果只是做个陪诊服务的小程序也基本能满足了,整体测试了下海参崴发现BUG,小程序端也能正常为使用,唯一用户授权接口是老的。 应用背景:人口老龄化少子化&#xff…...

Java中线程的生命周期

Java中线程的生命周期 Java中线程的声明周期与os中线程的生命周期不太一样,java中线程有6个状态,见下: NEW: 初始状态,线程被创建出来但没有被调用 start() 。RUNNABLE: 运行状态,线程被调用了 start()等待运行的状态…...

光线追踪RayTracing,基本原理,判断物体与光线相交

光线的三点假设: 光线按直线传播光线之间不会发生碰撞光线会经过一系列折射反射进入摄像机 可以从摄像机发出光线,推出可逆的光路 上图中,透明球在与相机直连的线条处,需要将折射和反射的着色点结果相加,如果有光源直…...

三十六、数学知识——组合数(递推法 + 预处理法 + 卢卡斯定理 + 分解质因数求解组合数 + 卡特兰数)

组合数算法主要内容 一、基本思路1、组合数基本概念2、递推法——询问次数多 a b 值较小 模处理(%mod)3、预处理阶乘方法——询问次数较多 a b 值很大 模处理(%mod)4、卢卡斯定理——询问次数较少 (a b 值很大&am…...

LinuxC编程——高级文件操作

目录 一、查询文件信息1、stat2、stat fstat lstat区别 二、目录操作2.1 opendir2.2 readdir2.3 closedir例练习:实现ls操作 三、库3.1 库的定义3.2 库的分类3.2.1 静态库3.2.2 动态库 3.3 创建库3.3.1 静态库制作3.3.2 动态库制作 一、查询文件信息 1、stat int …...

【基础知识整理】图的基本概念 邻接矩阵 邻接表

一、图概述 定义: 图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的; 其中,点通常被成为"顶点(vertex)“,而点与点之间的连线则被成为"边或弧”(edege)。 通常记为,G(V,E)。 图是一种重要的…...

5.程序控制结构|Java学习笔记

文章目录 程序流程控制介绍顺序控制分支控制分支控制if elseswitch分支结构 循环控制for循环控制while循环控制do...while循环控制跳转控制语句breakcontinuereturn 程序流程控制介绍 顺序控制分支控制循环控制 顺序控制 程序从上到下逐行地执行,中间没有任何判断…...

【最优PID 整定】PID性能指标(ISE,IAE,ITSE和ITAE)优化、稳定性裕量(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Linux内核中断和Linux内核定时器

目录 Linux内核中断 Linux内核定时器 Linux内核中断 int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev) 功能:注册中断 参数: irq : 软中断号 gpio的软中断号 软中断号 gpio_to_i…...

OMG--IDL(Interface Definition Language)

OMG--IDL(Interface Definition Language) 1 概述2 内容缩写IDL 语法和语义概述词法约定ISO Latin-1的字母字符如下表十进制数字字符图形字符格式化字符Tokens注释标识符冲突规则转义标识符关键字IDL识别的其他字符字面量 预处理IDL 语法构建块核心数据类…...

英语学习:M开头

machine 机器 mad 发疯的,生气的 madam 女士,夫人 madame 夫人 magazine 杂志 magic 有魔力的 maid 女仆,侍女 mail 邮递 mailbox 邮箱 mainland 大陆 major 较大的,主要的 majority 大多数 male 雄的 man 人类 man…...

【计算机组成原理与体系结构】控制器

目录 一、CPU的功能与基本结构 二、指令周期的数据流 三、数据通路 四、硬布线控制器 五、微程序控制器 六、微指令 一、CPU的功能与基本结构 运算器基本结构 控制器基本结构 CPU的基本结构 二、指令周期的数据流 取址周期 间址周期 中断周期 指令周期流程 三、数据通路 …...

结构化命令

章节目录: 一、使用 if-then 语句二、if-then-else 语句三、嵌套 if 语句四、test 命令4.1 数值比较4.2 字符串比较4.3 文件比较 五、复合条件测试六、if-then 的高级特性6.1 使用单括号6.2 使用双括号6.3 使用双方括号 七、case 命令八、结束语 本章内容&#xff1…...

Java Web实训项目:西蒙购物网

文章目录 一、创建数据库和表1、创建数据库2、创建用户表3、创建类别表4、创建商品表5、创建订单表 二、创建Simonshop项目1、创建web项目2、修改Artifacts名称:simonshop3、重新部署项目4、编辑首页5、启动应用,查看效果 三、创建实体类1、用户实体类2、…...

ChatGPT Prompt 提示词设计技巧必知必会

本文内容整理自图灵社区直播《朱立成:ChatGPT Prompt提示词技巧必知必会》。 朱立成,图灵社区《ChatGPT即学即用》视频课程作者,软件工程师,对新事物充满好奇,关注ChatGPT应用。2001年毕业于浙江大学,从事软…...

尚硅谷-云尚办公-项目复盘

尚硅谷-云尚办公-项目复盘 资料地址本文介绍问题汇总问题1.knife4j无法下载 视频4问题2.dev等含义 视频5问题3.wrapper继承/实现图 视频8问题4.修改统一返回结果 视频11问题5.修改后新增也变修改 视频29问题6.redis中key值乱码 视频55-60问题7.RangeError: Maximum call stack …...

nacos升级到2.0.3(单机模式)

前提&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明 Spring Cloud AlibabaSpring CloudSpring BootNacos2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE2.0.3 一、pom.xml文件 <parent><groupId>org.springframework.boot&…...

Koa学习3:用户添加、错误处理

模型 在src目录下创建model目录&#xff0c;用来存放模型 创建用户模型 user.model.js 注意&#xff1a; UUID类型是无法自增的&#xff0c;将id设置为UUID类型时只需要为其指定默认值即可 // 数据类型 const { DataTypes } require(sequelize); // 导入已经连接了数据库…...

网络安全入门学习第十五课——PHP基础

文章目录 一、WEB技术1、什么是web2、B/S架构3、C/S架构 二、PHP概述1、PHP是什么2、PHP受欢迎的原因3、基于MVC模式的PHP框架4、常用编译工具5、PHP环境搭建6、开发工具 三、PHP基本语法格式1、标记2、输出语句3、注释4、标识符 四、数据与运算1、常量1.1、常量定义1.2、预定义…...

电子科技大学 数学专业-功不唐捐,玉汝于成

电子科技大学 数学专业 功不唐捐&#xff0c;玉汝于成 1.本科背景 本科是坐落于湖南湘潭的湖南科技大学&#xff0c;专业为网络工程专业&#xff0c;因热爱数学专业&#xff0c;所以决定跨考数学专业。 本科专业课平均成绩85&#xff0c;排名10/104。CET 4 474分&#xff0c;…...

Android10.0 iptables用IOemNetd实现删除子链功能的实现

1.前言 在10.0的系统rom定制化开发中,在system中netd网络这块的产品需要中,会要求设置屏蔽ip地址之内的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现删除创建子链的相关功能 2. iptables用IOemNetd实现删除创建子链功能的实现的核心类 syste…...

OpenGL光照之光照贴图

文章目录 漫反射贴图镜面光贴图放射光贴图代码 每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观&#xff0c;但是这仍不能对一个物体的视觉输出提供足够多的灵活性。 我们将整个物体的材质定义为一个…...

2018~2019 学年第二学期《信息安全》考试试题(B 卷)

北京信息科技大学 2018 ~2019 学年第 2 学期 《信息安全》课程期末考试试卷 B 课程所在学院:计算机学院 适用专业班级:计科 1601-06&#xff0c;重修 考试形式:(闭卷) 一. 选择题(本题满分 10 分&#xff0c;共含 10 道小题&#xff0c;每小题 1 分) 网络中存在的安全漏洞主…...

LeetCode-C#-0002.两数相加

0.声明 该题目来源于LeetCode 如有侵权&#xff0c;立马删除。 解法不唯一&#xff0c;如有新解法可一同讨论。 1.题目 0002两数相加 给你两个非空的链表&#xff0c;表示两个非负的整数&#xff0c;它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一…...

访问修饰符private,default,protected,public访问等级区别

private&#xff1a;private是最严格的访问修饰符&#xff0c;它将成员声明为私有的。私有成员只能在声明它们的类内部访问&#xff0c;其他类无法直接访问私有成员。这样可以确保数据的封装性和安全性。 default&#xff08;默认&#xff09;&#xff1a;如果没有明确指定访问…...

阿里云(Linux)安装Docker教程

首先安装docker&#xff0c;需要找到帮助文档&#xff0c;那肯定是我们的官网&#xff1a; Install Docker Engine on CentOS | Docker Documentation 找到对应的位置&#xff0c;这里是安装在CentOS中&#xff0c;版本需要Ce…...

Linux C编程基础:获取时间

1.前言 对于linux下的编程&#xff0c;无论是用户态还是内核态&#xff0c;时间获取都是经常需要使用到的。以下分别从用户态和内核态整理了几个常用的时间获取接口&#xff0c;供编写代码时快速查阅。 2.用户态获取时间 2.1 clock_gettime() #include <time.h>int c…...

Spring核心注解

1、Bean注解 作用&#xff1a;用于把当前方法的返回值作为bean对象存入spring的ioc容器中位置: 一般出现在方法上面属性: name:用于指定bean的id。当不写时&#xff0c;默认值是当前方法的名称细节&#xff1a;当我们使用注解配置方法时&#xff0c;如果方法有参数&#xff0c;…...

哈希表原理,以及unordered_set/和unordered_map的封装和迭代器的实现

哈希表 unordered系列unordered_set和unordered_map的使用哈希哈希概念哈希冲突哈希函数闭散列开散列哈希表的扩容哈希表源码&#xff08;开散列和闭散列&#xff09; 封装unordered_set/和unordered_map&#xff0c;以及实现迭代器节点定义unordered_set定义unordered_map定义…...

苏州网站开发公司电话/网店代运营公司靠谱吗

今天遇到一个问题&#xff1a;pc客户端和android的App通信&#xff0c;心跳通道&#xff08;心跳包27个字节&#xff0c;是一个业务空包&#xff09;在部分pc上总是会超时&#xff08;5秒超时&#xff09;&#xff0c;nagle算法也给禁用了&#xff0c;pc端时按按量发送心跳的&a…...

酒店为什么做网站/网站快速优化排名app

基础性质概念1)历史发展久&#xff0c;与java同期2)版本3.X 2.7lib多 常用3)脚本语言&#xff0c;不需要编译4)解释性语言&#xff0c;读一行解释一行5) 运行性能较差&#xff0c;没有ruby差 哈哈哈哈6) lib(库文件)多&#xff0c;声音视频&#xff0c;数据挖掘&#xff0c;…...

深圳企业建站设计公司/营销活动推广方案

使用python逐行读取文件内容的几个方法&#xff1f;方法一:使用readline读取&#xff1a; f open("fix.txt") line f.readline() while line: print line line f.readline() f.close() 方法二&#xff1a; for line in open("fix.txt&q…...

公司的网站怎么做推广/百度竞价推广计划

该工具类是用于操作Java.lang.String类的。 StringUtils类与String类的区别在于&#xff1a;此类是null安全的&#xff0c;即如果输入参数String为null&#xff0c;则不会抛出NullPointerException异常&#xff0c;代码更健壮。以函数isEmpty为例子&#xff1a;存在字符串strin…...

石家庄有哪些做网站的公司/百度销售推广

1、下载安装git 及设置&#xff08;windows版&#xff09; 网址&#xff1a;https://git-scm.com/download/win 1&#xff09;点击Git for Windows Setup版本下载&#xff1a; 2&#xff09;点击exe文件安装&#xff0c;一路Next&#xff0c;安装完成后桌面或目录下右键打开…...

中国芯片制造最新消息/seo优化案例

Three.js是一个轻量级的跨浏览器JavaScript库&#xff0c;用于在浏览器中创建和显示动画3D计算机图形。将Cesium的行星级渲染和GIS功能与Three.js广泛而易用的通用3D API相结合&#xff0c;为新的WebGL体验开启了许多可能性。3D JavaScript库现在已经完全成熟并且广为人知&…...