JVM学习笔记(持续更新)

JDK、JRE、JVM区别?

在这里插入图片描述

类加载过程

装载 验证 准备 解析 初始化
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

类加载器分类

在这里插入图片描述

双亲委派模型

在这里插入图片描述
如何打破双亲委派模型?
自定义类加载器,集成ClassLoader类重写loadClass,如Tomcat

JVM内存模型

JVM 需要使用计算机的内存,Java 程序运行中所处理的对象或者算法都会使用 JVM 的内
存空间,JVM 将内存区划分为 5 块,这样的结构称之为 JVM 内存模型。

JVM为什么进行内存区域的划分?

随着对象数量的增加,JVM 内存使用率也在增加,如果 JVM 内存使用率达到 100%,
则无法继续运行程序。为了让 JVM 内存可以被重复使用,我们需要进行垃圾回收。为了提高垃圾回收的效率JVM 将内存区域进行了划分

JVM内存划分

JVM 按照线程是否共享将内存首先分成两大类
线程独享区
当有当前线程能访问数据的区域,线程之间不能共享,随着线程的创建而创建,随着线程的销毁而被回收。线程存在的时间较短,一般不涉及垃圾回收
线程共享区
所有的线程都可以访问的区域,当线程被销毁的时候,共享区的数据不会被立即回收,需要等待达到垃圾回收的阈值才会进行回收。垃圾回收的优化,主要是优化的线程共享区。
在这里插入图片描述

程序计数器

程序计数器会记录当前线程执行指令的内存地址,只占用一小部分区域,只记录一个地址,故我们认为程序计数器不会出现内存溢出的问题。

本地方法栈

Java中有些代码的实现是依赖于其他非Java语言的(C++),本地方法栈存储的是非Java语句执行中产生的数据。一般我们认为本地方法栈不会出现内存溢出的问题。

虚拟机栈

存放当前线程中所声明的变量,包括基本数据类型的数据和引用数据类型的引用。
基本数据类型和引用数据类型划分的标准:

  • 基本数据类型:

  • 四类八种(byte【1字节】、short 【2】、int【4】、 long【8】 、 char【2~3根据编码】、 boolean【1】 、float【4】 、double【8】)
    变量在声明的时候就能确认占用内存的大小。
    引用数据类型将值的引用存放在虚拟机栈中,对象存放在堆内存中,引用数据类型占4个字节

  • 引用数据类型:
    (对象、数组、接口)
    变量在声明的时候,不能取人占用内存的大小。

栈帧

每个线程都会对应一个虚拟机栈,线程的每个方法都会创建一个栈帧,存放本次方法执行过程中所需要的数据。
如果一个线程中有多个方法嵌套调用,虚拟机栈会对栈帧进行压栈和出栈操作,正在执行的方法一定在栈顶,我们只能获取栈顶的栈帧,栈帧在虚拟机栈中先进后出。

栈帧的数据结构

在这里插入图片描述

  • 1、局部变量
    存放当前方法的局部变量,基本数据类型存值,引用数据类型存内存地址。
  • 2、操作数栈
    对方法中的变量提供计算的区域
  • 3、常量数据的引用
    常量数据会存放到方法区的常量池中,不管是基本数据类型还是引用数据类型。
  • 4、方法返回值的地址
    方法返回数据会存到计算机内存的寄存器中。
虚拟机栈溢出异常

在这里插入图片描述

修改虚拟机栈的内存大小设置栈帧的最大深度:-Xss 虚拟机栈内存大小。
一般栈帧深度达到3000~5000即可。
太小虚拟机栈容易溢出,太大导致每个线程内存占用过大,影响线程数量。

方法区

在 java8 之后,我们把方法区称之为元空间(MetaSpace),方法区在逻辑上属于堆的一部分,但一些具体机制和堆有所区别,如:一些 JVM 的方法区是可以不进行垃圾回收的,关闭 JVM 时才会释放方法区内存。所以方法区还有一个别名叫非堆,目的是和堆分开。
方法区会存储类信息、静态变量、常量(JDK8 之后不存放字符串常量)、本地机器指令
如果加载大量 class 文件,也会造成方法区内存溢出,如一个 tomcat 运行 20~30 个项目。

堆内存模型

JAVA 对象内存布局

在这里插入图片描述

对象头

MarkWord:一系列标记位(哈希码、分代年龄、锁状态标记等),在 64 位系统中占8 字节;
ClassPoint:对象对应的类信息的内存地址,在 64 位系统中占 8 字节。
Length:数组对象特有,表示数组长度,占 4 字节。

实例数据:

包含了对象的所有成员变量,大小由变量类型决定。
byte、boolean:1 字节
short:2 字节
char:2~3 字节
int、float:4 字节
long、double、引用数据类型:8 字节

对其填充

将对象大小填充为 8 字节的整数倍

JVM 内存溢出和垃圾回收机制

为什么要进行堆内存分区:
1、提高垃圾搜索效率;
2、垃圾回收后可以更好的利用内存空间,存放大对象;
3、尽可能减少GC次数

JVM 堆内存的划分

在这里插入图片描述
老年代:
对象会优先分配到新生代内存中,每次 GC 后没有回收的对象年龄加 1,年龄到15 还没有被回收,对象会存放到老年代内存中;如果对象较大,超过新生代内存的一半,对象也会存放到老年代区域。
新生代:
为了减少young区垃圾回收后的空间碎片,新生代又分为Eden区和两个Survivor区,且始终有一个 Suvivor 区保持闲置。对象会先存放到 Eden 区当中,Eden 区空间满了之后会进行 young 区的垃圾回收,之后将 young 区所有存活的对象复制到闲置的 Suvivor 区中,并清空 Eden 区和正在使用的 Survivor 区。

YoungGC 和 OldGC

YoungGC

新生代区域的垃圾回收称之为 YoungGC,也叫 MinorGC,Eden 区满后会触发YoungGC

OldGC

老年代区域的垃圾回收称之为 OldGC,也叫 MajorGC,OldGC 非常浪费性能,
所以我们的 JVM 调优要尽可能减少 OldGC 的次数, OldGC 往往伴随着 YoungGC。YoungGC+OldGC = FullGC

问题:

Survivor 区空间并不大,如果满了怎么办?

1、一般情况下 GC 会回收 95%的对象,且超过 15 次 GC 的对象会存放到 old区,所以 Survivor 区不容易满。
2、如果 Survivor 区满了,会触发担保机制,提前将对象存入 Old 区。

为什么需要 Survivor 区?

为了减少垃圾回收带来的空间碎片,空间碎片过多会频繁触发YoungGC。

为什么需要两块 Survivor 区?

为了减少 Survivor 区的空间碎片。

垃圾回收机制

如何判断一个对象是垃圾

在这里插入图片描述

引用计数法:

如果要操作对象,必须通过引用来进行。如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到。那么这个对象就成为可被回收的对象了。这种方式实现简单,效率较高,但是它无法解决循环引用的问题,因此在 Java 中并没有采用这种方式(Python 采用的是引用计数法)。

达性分析:

以一个GC Root对象作为起点进行搜索,如果在GC Roots和对象之间没有可达路径,以一个GC根对象作为起点进行搜索,如果在GC根和对象之间没有可达路径则称该对象是不可达的。

GC ROOT对象∶

  • 栈帧中的本地变量表中引用的对象。
    我们正在执行的方法是在顶部栈帧中,正在执行的方法所引用的对象必定是很重要的对象
  • 方法区中静态属性引用的对象。
    类中的变量,整个程序都要用的东西,很重要
  • 方法区中常量引用的对象。
    也是要一直使用的对象
  • 本地方法栈中引用的对象.
    存放的是一些非Java语言的对象

常见面试题补充

内存泄漏和内存溢出是一样的概念吗?

不一样,内存泄漏指不再使用的对象无法得到及时的回收,持续占用内存空间,造成内存空间的浪费。内存溢出指程序运行要用到的内存大于能提供的最大内存。内存无法内存泄漏很容易导致内存溢出,内存溢出不一定是内存泄漏导致的。

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

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

相关文章

【LeetCode 101】对称二叉树

1. 题目 2. 分析 这道题比较经典。我又一次做错了,这次是花了20min都没有做出来。 最开始我的思想就是,递归比较左根节点的左子树和右根节点的右子树是否对称即可,然后觉得能解决问题了,便动手coding。哪知道,又碰到了…

电源滤波器怎么选用

电源滤波器怎么选用 滤波器应用场景及作用第一步:第二步:第三步:第四步: 滤波器应用场景及作用 可以有效解决EMC测试无法通过、端口防护、滤除干扰、设备保护等问题 主要功能有: 1、降低主电源谐波; 2、保护驱动装置电力电子元件…

算法人生(18):从神经网络的“剪枝策略”看“怎么找回时间”

IT人的工作和生活难平衡这事,到底要怎么解决呢,让我们从神经网络的“剪枝策略”中找点灵感吧! 剪枝策略是指训练和优化深度神经网络时采取的一种技术,从名字就知道,它就像修剪树木一样,去除不必要的枝叶&a…

Vuex 是什么?VueX简介

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介Vuex 是什么核心概念1.State(状态)2. Getter(获取器)3. Mutation(突变)4. Action(动作)5. Module(模块) 原理解…

使用STS临时访问凭证通过客户端直连OSS对象存储服务器

目录 1、导论 2、客户端直传 3、创建RAM用户以及RAM角色 4、如何实现客户端直传 4.1、跨域访问 4.2、安全授权 5、代码示例 5.1、后端代码实例 5.2、客户端代码实例 1、导论 最近在做项目的过程中使用到了阿里云OSS来存储客户端上传的文件,方法是直接将客…

Keras深度学习框架实战(3):EfficientNet实现stanford dog分类

1、通过EfficientNet进行微调以实现图像分类概述 通过EfficientNet进行微调以实现图像分类,是一个使用EfficientNet作为预训练模型,并通过微调(fine-tuning)来适应特定图像分类任务的过程。一下是对相关重要术语的解释。 Effici…

Flutter-自定义可展开文本控件

Flutter 在移动开发中,常常需要处理一些长文本显示的场景,如何优雅地展示这些文本并允许用户展开和收起是一个常见的需求。在本文中,我将分享如何使用Flutter实现一个可展开和收起的文本控件。 效果 我们将实现一个可展开和收起的文本控件…

yolov10模块

yolov10模块 1 C2f2 C2fCIB2.1 CIB2.2 RepVGGDW 3 PSA4 SCDown5 v10Detect 论文代码:https://github.com/THU-MIG/yolov10 论文链接:https://arxiv.org/abs/2405.14458 Conv是Conv2dBNSiLU PW是Pointwise Convolution(逐点卷积) DW是Depthwise Convolut…

【SQL学习进阶】从入门到高级应用【企业真题】

文章目录 第一题第二题第三题第四题第五题第六题第七题第八题第九题MySQL行转列使用case whengroup by完成 第十题 🌈你好呀!我是 山顶风景独好 💕欢迎来到我的博客,很高兴能够在这里和您见面! 💕希望您在这…

疫情物资捐赠和分配系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,机构管理,用户管理,发放管理,物资管理 前台账户功能包括:系统首页,个人中心,物资论坛,公告信息…

STM32作业设计

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

彻底卸载Windows Defender

概述 卸载Windows Defender的方法有很多,如修改注册表、组策略,执行脚本等等,这些方法操作过于繁琐和复杂,不适合小白,今天带来一款强大的卸载工具,只需要以管理员身份运行该软件即可,不用其他操…

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》Chapter 6插图

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 Chapter 6插图

Stable Diffusion详细教程

目录 🐋引言 🐋Stable Diffusion基本概念 🦈潜在扩散模型 🦈图像生成原理 🐋Stable Diffusion安装部署 🦈环境要求 🦈安装步骤 🐋Stable Diffusion阶段 🦈准备阶…

PHP 页面报错Warning</b>: Cannot modify header information - headers already sent by

先给出解决方案再解释,如果急着用就不用看解释了。 解决方案一:保存php文件编码为utf-8无BOM码,具体操作可以用notepad等编辑器完成,把 sesstion_start() 放在文档所有输出(包括html标签和php的输出语句,具…

ch4网络层---计算机网络期末复习(持续更新中)

网络层概述 将分组从发送方主机传送到接收方主机 发送方将运输层数据段封装成分组 接收方将分组解封装后将数据段递交给运输层网络层协议存在于每台主机和路由器上 路由器检查所有经过它的IP分组的分组头 注意路由器只有3层(网络层、链路层、物理层) 网络层提供的服务 一…

Java筑基-集合[Set、Map、List、Stack、Queue]

这里写目录标题 一、Collection接口结构图二、Set集合1、常用方法 三、List集合1、List集合常用方法2、代码案例 四、Stack集合1、方法2、代码展示 五、Queue集合1、常用的方法2、代码展示 六、Map集合1、基本概念2、常用方法3、代码展示 一、Collection接口结构图 二、Set集合…

小熊家务帮day8-day9 客户管理模块2 (用户定位,地址簿,实名认证,银行卡信息上传等功能)

客户管理模块 0.用户定位功能0.1 需求0.2 接口分析0.3 接口开发Controller层开发Service层开发 1.我的地址簿功能1.1 需求1.2 数据库设计1.3 新增地址簿1.3.1 接口设计1.3.2 接口开发Controller层开发Service层开发测试功能 1.4 地址簿查询1.4.1 接口设计1.4.2 接口开发Control…

Caliburn.Micro框架学习笔记——多页面处理案例

在聊这个之前,我们先来看一个静态类 在 Caliburn.Micro 中,ViewLocator 是一个用于查找和关联视图与视图模型的静态类。默认情况下,它根据约定(命名约定或其他规则)自动找到与视图模型相对应的视图。然而,…

C语言 | Leetcode C语言题解之第126题单词接龙II

题目: 题解: char** list; int** back; int* backSize;// DFS uses backtrack information to construct results void dfs(char*** res, int* rSize, int** rCSizes, int* ans, int last, int retlevel) {int i ans[last];if (i 0) {res[*rSize] (c…