关于JVM:内容以及流程释义

news/2024/5/2 14:04:31/文章来源:https://blog.csdn.net/qq_20057315/article/details/128202475

对于JVM、GC、类加载,很多人摸不清楚头绪,不知道他们之间的关系。误以为GC和类加载还有JVM区分统称垃圾回收,实则他们包含的东西很多,很细,完整的了解正个JVM的加载过程,就需要全面理解这些东西。

我认为的理解相互关联步骤:

类的加载过程

通过类的加载延伸到gc的编译原理

根据gc得到解决方案并拓展锁知识

根据这些完全熟悉gc的生态链

下面开始开始简述相关知识。

1.内存区域类型

*.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制;

*. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。);

*. 堆:存放所有new出来的对象;

*. 静态域:存放静态成员(static定义的);

*. 常量池:存放字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中 ;

*. 非RAM存储:硬盘等永久存储空间

2.堆栈空间分配

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表

3.堆栈缓存方式

栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

4、数据结构中的堆和栈

堆和栈在数据结构中是两种不同的数据结构。 两者都是数据项按序排列的数据结构。

栈:像是装数据的桶或者箱子

栈是大家比较熟悉的一种数据结构,它是一种具有后进先出的数据结构,也就是说后存放的先取,先存放的后取,这就类似于我们要在取放在箱子底部的东西(放进去比较早的物体),我们首先要移开压在它上面的物体(放入比较晚的物体)。

堆:像是一颗倒立的大树

堆是一种经过排序的树形数据结构,每个节点都有一个值。通常我们所说的堆的数据结构是指二叉树。堆的特点是根节点的值最小(或最大),且根节点的两个树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意的,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

一.类加载

1.类加载的过程

在这里插入图片描述

(1)将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。

(2)分为三个阶段:

        1)验证阶段:验证文件的安全性,防止对jvm本身造成危害;2)准备阶段:正式为类变量(static变量)分配内存并设置类变量初始值3)解析阶段:虚拟机常量池的符号引用替换为字节引用过程

(3)执行类构造器初始化类对象;

总结:初始化-加载-销毁

2.由类加载过程延伸的问题

(1)类加载器?

   虚拟机提供了3种类加载器:启动类加载器:主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分;扩展类加载器:负责加载JAVAHOME路径下的jdk中的一些类库;系统类加载器:负责加载CLASSPATH路径下的应用程序。

(2)jvm以什么样的方式加载一个类

   采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式即把请求交由父类处理,它一种任务委派模式。 那么,一起来理解下双亲委派模式:

image.png

双亲委派:如图,根据自定义类加载器-再到系统类-然后拓展类-最后引导类加载器。如果你在最下层系统类加载器中,编写了一个StringUtil,但是在引导类加载器也有一个相同类,默认只加载系统存在的StringUtil,主要原因是防止修改核心类,保证安全性, 双亲委派模式的好处是避免了一个类会被重复加载。

3.jvm什么时候决定加载一个类?

   1)创建对象就会触发加载;2)引用了该类的静态属性、方法都会触发类的加载;3)初始化子类也会导致父类被加载;

4.java中创建对象的几种方式?

   1) new对象2) 用反射创建对象(代理)3) 克隆对象4) 序列化

二.JVM

JVM定义:指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。

线程私有区域:程序计数器、Java虚拟机栈、本地方法栈(与线程生命周期一致)

线程共享区域:Java堆、方法区、运行时常量池

jvm主要知道它各个模块与作用即可。(小型独立运行的虚拟机)

三.GC

1.GC本质上就是对JVM内存管理的一个名词(垃圾回收)。

栈:和唯一的一个线程强绑定,线程出现就需要这块内存,线程结束,这块内存就可以回收了,这块内存的分配/回收时机是明确的,就不需要 GC 来操心。

常量池+方法区:首先,这两块内存占比较小,其次,里面的数据很少“失去作用”。回收这块内存性价比不高,也不是重点考虑的。

堆:GC 的重点就是如何管理堆上的内存。堆上的内存是以对象为单位进行管理的,分配与回收的都是一个完整的对象。因此,回收转换成了回收死对象的问题。

2.如何判断对象已死

死对象:没有引用指向的对象。

1)引用计数法ReferenceCount:无法解决对象的循环引用问题

给对象增加一个引用计数器,每当有一个地方引用它时,计数器就+1;当引用失效时,计数器就-1;任何时刻计数器为0的对象就是不能再被使用的,即对象已"死"。 引用计数法实现简单,判定效率也比较高。
2)可达性分析算法

核心思想: 通过一系列称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称之为"引用链",当一个对象到GC Roots没有任何的引用链相连时(从GC Roots到这个对象不可达)时,证明此对象是不可用的。

GC Roots的对象包含下面几种:

   虚拟机栈(栈祯中的本地变量表)中引用的对象

方法区中的静态属性不回收,所以有引用指向的对象必须活着,常量引用的对象

常量池中引用指向的对象

如果在GC过程中,可达性分析后对象的引用关系发生了变化,有可能造成对象回收错误,所以通常在GC中,会通知应用线程的执行(STW:Stop The World)

3.引用分类

1)强引用:被引用的对象必需活着

2)弱引用:gc就回收

3)虚引用:和引用无关,但是回收会通知

4)软引用:被引用的对象尽可能活着,但是内存紧张可以回收

4.垃圾回收算法

1)标记清除:标出所有需要回收的对象回收。

2)复制算法(新生代回收算法):把空间分2区域,把使用的对象复制到新区域,便于区分回收。缺点:需要翻倍内存。

3)标记整理(老年代回收算法):第一阶段标记被引用对象,第二阶段遍历堆,清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。(清除和复制的结合)

4)分代收集算法:根据对象存活周期分块,分为新生代和老年代。新生代采用复制,老年代采用标记整理

对象在Eden区分配

大多数情况下,对象在新生代中 Eden 区分配。当 Eden 区没有足够空间进行分配时,虚拟机将发起一次Minor GC。

看看 Minor GC和Full GC 有什么不同呢?

Minor GC/Young GC:指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快。

Major GC/Full GC:一般会回收老年代 ,年轻代,方法区的垃圾,Major GC的速度一般会比Minor GC的慢10倍以上。

Eden与Survivor区默认8:1:1 大量的对象被分配在eden区,eden区满了后会触发minor gc,可能会有99%以上的对象成为垃圾被回收掉,剩余存活 的对象会被挪到为空的那块survivor区,下一次eden区满了后又会触发minor gc,把eden区和survivor区垃圾对象回 收,把剩余存活的对象一次性挪动到另外一块为空的survivor区,因为新生代的对象都是朝生夕死的,存活时间很短,所 以JVM默认的8:1:1的比例是很合适的,让eden区尽量的大,survivor区够用即可

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

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

相关文章

如何在 Windows 10 上启用和设置 BitLocker 加密

启用和设置 BitLocker 加密 通过控制面板启用 BitLocker通过命令提示符启用 BitLockerBitlocker 可以使用控制面板中的图形界面或在命令提示符中执行一些命令来启用。在 Windows 10 上启用 Bitlocker 非常简单,但用户通常更喜欢通过控制面板而不是命令提示符来管理 Bitlocker …

Java数据结构与Java算法学习Day05---二叉树(简略笔记记录)

目录 一、二叉树 79 1.1树的基本定义79 1.2数的相关术语 80 1.3二叉树的基本定义 81 1.4二叉查找树的创建 82 1.4.1二叉树查找树创建---插入方法(put) 83 1.4.2二叉树查找树创建---获取方法(get)84 1.4.3二叉树查找树创建…

【测试沉思录】23. 如何实现基于场景的接口自动化测试用例?

作者:陈爱娇 编辑:毕小烦 自动化本身是为了提高工作效率,不论选择何种框架,何种开发语言,我们最终想实现的效果,就是让大家用最少的代码,最小的投入,完成自动化测试的工作。 基于这…

K-Means++代码实现

K-Means代码实现 数据集 https://download.csdn.net/download/qq_43629083/87246495 import pandas as pd import numpy as np import random import math %matplotlib inline from matplotlib import pyplot as plt# 按文件名读取整个文件 data pd.read_csv(data.csv)class…

学编程:Python入门考级必备[11]

目录 1.查找字符串 2.字符串的格式化 3.字符串的转义字符 \ \" 4. 修改字符串 5.字符串连接与分割 附件代码: 炼 知识模块(11) 名符其实--字符串 1.查找字符串 # 1.1用 in 函数 a aa in acacacacaabaac print(a) # 1.2 用index 找不到就报错 b h…

民办二本程序员阿里、百度、平安等五厂面经,5 份 offer(含真题)

昨天小休,一位高中同学联系了我,说是要请我吃饭,有这种好事,我当然是毫不犹豫的答应了啦! 等等...会不会是找我借钱的? 好慌,怎么办?已经答应过去了。 在后面的交谈中,…

Odoo丨如何在明细行中添加复选框?

最近,在项目实际业务中遇到需要对明细订单添加复选框和按钮进行操作的需求。 起初在拿到需求时,我联想到Odoo默认tree视图是有复选框和操作按钮的功能,于是查看了源码,确认了这个想法。 因为这个是属于字段中one2many 关系属性来…

三车道交通流元胞自动机研究(matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

中国电信移动物联网发展成果与创新实践 ,干货满满

近日,首届移动物联网大会(2022)(以下简称“大会”)在江苏省无锡市举办。本次大会由工信部指导,中国信息通信研究院(以下简称“中国信通院”)、中国通信学会、无锡市人民政府、人民邮…

大数据学习:进程管理

文章目录一、进程ID(PID)二、查看进程1、进程查看命令-ps(1)命令作用(2)参数说明(3)操作案例2、Linux进程状态3、观察进程变化命令 -top(1)参数选项&#xff…

超声功率放大器在MEMS超声测试中的应用

MEMS(微机电系统)技术的不断发展,目前已经广泛应用在生物、航空、医学、航天等多领域。MEMS传感器即微机电系统(Micro-electroMechanicalSystems),是指精密机械系统和微电子电路技术结合发展出来的一项工程…

【正点原子FPGA连载】第二十八章 以太网ARP测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十八章 以太…

【C++11多线程】线程同步之线程互斥:mutex、lock_guard

文章目录1.mutex2.锁双重判断3.lock_guard4.unique_lockunique_lock的构造函数1.mutex 头文件 #include <mutex> mutex 是一个类&#xff0c;其源码如下图所示。 互斥锁其实就是一个类对象&#xff0c;多个线程尝试用成员函数 lock() 来加锁&#xff0c;只有一个线程能…

自定义HandlerMethodArgumentResolver如何注册到springmvc框架里的

目录 1.DEBUG 注册代码 1.1 WebMvcConfigurerComposite 1.2 DelegatingWebMvcConfiguration 1.3 AutowiredAnnotationBeanPostProcessor 2.DEBUG调用代码 2.1 this.argumentResolvers 日常工作开发中&#xff0c;总有一些参数&#xff0c;在未传参数时&#xff0c;需要自定…

Web3中文|马斯克也疯狂?网红AI “ChatGPT”有多火?

一个名为“ChatGPT”的网红AI竟写出了毁灭人类的计划书。 计划书的步骤详细到入侵各国计算机系统、控制武器、破坏通讯、交通系统等等。和电影里的情节一模一样&#xff0c;甚至ChatGPT还给出了相应的Python代码。 诱导ChatGPT写下该计划的是一位名为扎克德纳姆&#xff08;Z…

计算机网络-网络层:IP协议

目录 一、IP协议格式 二、IP地址管理 1.动态地址分配&组建私网 1.1 动态地址分配DHCP 1.2 NAT技术组建私网 2. 早期网络划分方式 3. 当前网络划分方式CIDR方案 4. 特殊IP地址 5. 公网与私网&#xff08;外网与内网&#xff09; 6. 路由选择 网络层&#xff1a;负…

【win11内存占用高优化】未运行程序,系统内存占用50以上

这里写自定义目录标题前言打开控制面板找到电源键功能找到快速启动选项&#xff0c;取消勾选&#xff0c;确定win X以管理员身份打开powershell输入如下命令&#xff0c;回车关闭终端完成前言 windows11在未运行任何其他程序的情况下&#xff0c;内存占用超50%&#xff0c;可…

深入浅出java nio

Buffer 缓冲 为什么需要缓冲&#xff1f; 思考&#xff1a;没有buffer之前的读写。 子类 常见类型的缓冲 ByteBuffer public abstract class ByteBufferextends Bufferimplements Comparable<ByteBuffer> {}ByteBuffer是抽象类无法直接实例化&#xff0c;可以通过all…

研究 | CT图像迭代重建算法研究进展

上次讲到我实现了一下代数迭代重建&#xff08;ART&#xff09;&#xff0c;到周六开会的时候才大概了解了我的研究方向应该是统计迭代重建&#xff0c;一下子就把我给搞懵了。按照书上的说法&#xff0c;统计迭代法是在发射型CT&#xff08;SPECT和PET&#xff09;中应用广泛&…

[附源码]计算机毕业设计勤工俭学管理小程序Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…