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

[Java、Android面试]_03_java内存管理:虚拟内存、堆、垃圾回收

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料,感兴趣的朋友可收藏+关注,
现分享如下:

文章目录

    • 1. Java虚拟机运行时数据区
    • 2. Java堆
    • 3. 垃圾回收
      • 3.1 如何确定对象能否被销毁
      • 3.2 垃圾回收算法

1. Java虚拟机运行时数据区

在这里插入图片描述
(1)堆
栈管运行,堆管存储;虚拟机栈负责执行代码,而堆则负责存储数据。
Java堆具有以下几个特点:
· 存储我们new出来的对象,不存放基本类型和对象引用
· 由于创建了大量对象,垃圾回收器主要工作在这块区域
· 线程共享区域,因此是线程不安全的
· 能够发生OutOfMemoryError
另外,堆区还可以划分新生代和老年代,新生代又可以进一步划分为Eden区,Surviveor1区,Survivor2区。

(2)方法区
方法区也是一块被重点关注的区域,主要特点如下:
· 线程共享区域
· 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
· 当方法无法满足内存分配需求时,将会排除OutOfMemoryError.

(3)虚拟机栈
· 虚拟机栈是线程私有的,每一个线程独享一个虚拟机栈,它的生命周期与线程相同
· 虚拟机栈存放的是基本数据类型(boolean、byte、char、short、float、long、double)以及对象的引用类型(reference类型,它不同于对象本身,根据不同的虚拟机实现,他可能是一个指向对象起始地址的应用指针,也可能是一个指向代表对象的句柄等)和returnAddress类型(指向了一条字节码指令的地址)
· 这个区域可能有两种异常:如果线程请求的深度大于虚拟机所允许的深度,将抛出StackOverflowError;如果虚拟机栈可以动态扩,当扩展时无法申请到足够内存时将抛出OutOfMemoryError.

(4)本地方法栈
本地方法栈与虚拟机栈所发挥的作用非常相似,其区别不过是虚拟机栈为虚拟机执行
Java方法(也就是字节码)服务,而本地方法则是为虚拟机使用到的Native方法服务。

(5)程序技术器
线程私有,它的作用是记录当前线程所执行的位置,这样,当线程重新获得CPU的执行权的时候,就直接从记录的位置开始执行,分支、跳转、循环、异常处理也都依赖这个程序计数器来完成。

2. Java堆

Java堆可以划分为新生代和老年代,新生代又可以进一步划分为Eden区、Survivor1区、Survivor2区。具体比例如下:
在这里插入图片描述

3. 垃圾回收

3.1 如何确定对象能否被销毁

通常判断一个对象是否被销毁有两种方法:
(1)引用计数法: 为对象添加一个引用计数器,每当一个对象被引用,则+1;每当一个对象引用失效时,则-1.当计数器为0时,表示该对象没有被引用,可以被回收
(2)可达性分析法: 通过一系列被称之为GC root,沿着引用链进行搜索,凡是在引用链的对象都不会被回收;反之,则可以被回收。
在这里插入图片描述
就像上图的那样,绿色部分的对象都在GC Roots的引用链上,就不会被垃圾回收器回收,灰色部分的对象没有在引用链上,自然就被判定为可回收对象。可作为GCroots的对象有:
· 虚拟机栈(栈桢中的本地变量表)中的引用的对象
· 方法区中的类静态属性引用的对象
· 方法区中的常量引用的对象
· 本地方法栈中JNI(Native方法)引用的对象

3.2 垃圾回收算法

(1)标记-清除算法
分为两个阶段:标记阶段和清除阶段。
标记阶段:首先通过根节点,标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。清除阶段:清除所有未被标记的对象
在这里插入图片描述

缺点:
1) 容易产生内存碎片,再来一个比较大的对象时不够分配时,会提前触发垃圾回收。
2) 扫描了两次空间,第一次标记,第二次清除。
适用场合:
(1) 存活对象较多的情况下,比较高效;
(2) 适用于老年代:大部分都是存活对象。

(2)复制算法
复制的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
在这里插入图片描述
缺点:

  1. 内存空间缩为原来的一半;
  2. 需要移动复制对象,较耗时

优点:
1)无内存碎片;
2)内存分配时,因为是连续的内存,只需要按顺序分配即可,分配速度快。

适用场合:

  1. 存货对象较少的时候比较高效;
  2. 适用于年轻代:基本上98%的对象都是朝生夕死的,存活率较低。

(3)标记-整理算法
标记整理算法是一种老年代回收算法,它在标记-清除算法的基础上做了一些优化。
首先,也需要从根节点开始对所有可达对象做一次标记;但之后,并不是简单的清理未标记对象,而是将所有的存活对象压缩到内存的一端,之后,清除另外一端空间。

这种方法既避免了碎片的产生,又不需要两块相同的内存空间,因此,性价比比较高。但由于需要移动内存块,它依旧不是很适合存活率较高的老年代。
在这里插入图片描述

(4)分代收集算法
分代收集算法就是目前虚拟机使用的回收算法。
它将内存分为各个年代,一般情况下将堆区分为老年代、新生代。针对不同的代使用不
同的算法。
在这里插入图片描述

新生代存活率较低,可以使用复制算法;而老年代存活率高,没有额外空间对它分配担保,所以可以使用标记-清除算法或标记整理算法。

本节完!

相关文章:

[Java、Android面试]_03_java内存管理:虚拟内存、堆、垃圾回收

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料,感兴趣的朋友可收藏关注, 现分享如下: 文章目录 1. Java虚拟机运行时数据区2. Java堆3. 垃圾回收3.1 如…...

PTA题解 --- 求整数段和(C语言)

今天是PTA题库解法讲解的第二天,接下来讲解求整数段和,题目如下: 为了解决这个问题,你可以遵循以下的思路: 1. 读取输入的两个整数A和B。 2. 使用一个for循环,从A遍历到B。 3. 在循环中,打印当…...

virsh管理虚拟机的命令行工具

virsh是一个管理虚拟机的命令行工具,提供了丰富的命令来查看、创建、管理虚拟机。以下是一些常用的virsh命令: 查看帮助和版本: virsh --help:查看virsh命令的帮助信息。virsh -version:查看virsh的版本信息。 查看虚…...

数据集成平台选型建议

一 数据集成介绍 数据集成平台是一种用于管理和协调数据流动的软件工具或服务。它的主要目标是将来自多个不同数据源的数据整合到一个统一的、易于访问和分析的数据存储库中。这些数据源可以包括数据库、云应用、传感器、日志文件、社交媒体等等。数据集成平台的关键任务是确保…...

Centos8安装Docker,使用阿里云源

一、前期准备 1.关闭防火墙,SELINUX systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/config查看状态 systemctl status firewalld systemctl status…...

FFmpeg概念和简单使用

FFmpeg是一个开源的跨平台多媒体处理工具套件,包含了用于处理音频、视频和图像的各种工具、库和命令行程序。它由一个主要的命令行工具ffmpeg和一系列相关工具组成,可以执行各种各样的多媒体操作。以下是FFmpeg中一些重要的概念: 音频、视频和…...

OJ_最长公共子序列

题干 C实现 #include <iostream> #include <stdio.h> #include <algorithm> using namespace std;int dp[1002][1002];int main() {int n,m;char s1[1001];char s2[1001];scanf("%d%d",&n,&m);scanf("%s%s",s1,s2);//dp[i][j]是…...

SpringBoot拦截器获取token用户对象优雅地传递到Controller层

项目场景&#xff1a; SpringBoot拦截器获取token用户对象优雅地传递到Controller层 问题描述 后端有许多接口都需要请求中携带有正确的Token&#xff0c;这时采用拦截器来验证token&#xff0c;但是每个接口都还是需要解析一遍token&#xff0c;浪费资源&#xff0c;不免显得…...

从零开始学HCIA之SDN03

1、VXLAN相关概念 &#xff08;1&#xff09;NVE&#xff08;Network Virtual Edge&#xff09;&#xff0c;网络虚拟化边界&#xff0c;是运行VXLAN的设备&#xff0c;其实体是一种虚拟逻辑接口&#xff0c;负责VXLAN数据的封装和解封装&#xff0c;其主要参数包括源VTEP以及…...

C语言深度理解之——结构体内存对齐

前言&#xff1a; 在C语言中&#xff0c;结构体&#xff08;struct&#xff09;是一种用户自定义的数据类型&#xff0c;可以包含不同类型的数据成员。在定义结构体时&#xff0c;编译器会根据平台的要求对结构体的内存进行对齐&#xff0c;以提高内存访问的效率。结构体内存对…...

LeetCode 热题 100 | 回溯(二)

目录 1 39. 组合总和 2 22. 括号生成 3 79. 单词搜索 菜鸟做题&#xff0c;语言是 C&#xff0c;感冒快好版 关于对回溯算法的理解请参照我的上一篇博客&#xff1b; 在之后的博客中&#xff0c;我将只分析回溯算法中的 for 循环。 1 39. 组合总和 题眼&#xff1a;c…...

混合内容错误https中加载了http

一、遇到问题 iframe嵌套时&#xff0c;混合内容错误https中加载了http&#xff0c;但是已经确认了ifreme中是https的&#xff0c;最后发现在/my/edit?applyid1改为/my/edit/?applyid1&#xff0c;加了一个斜杠&#xff0c;直接解决了 /my/edit是vue页面&#xff0c;其他页…...

游戏免费下载平台模板源码

功能介绍 此游戏网站模板源码是专门为游戏下载站而设计的&#xff0c;旨在为网站开发者提供一个高效、易于维护和扩展的解决方案。 特点&#xff1a; 响应式设计&#xff1a;我们的模板可以自适应不同设备屏幕大小&#xff0c;从而为不同平台的用户提供最佳的浏览体验。 …...

鸿蒙视频播放的实现

文章目录 前言播放效果视频播放的实现总结 一、前言 现在市面上很多应用都跟视频有关&#xff0c;那么在鸿蒙系统上怎么来播放视频呢&#xff0c;今天就讲解视频播放控件&#xff0c;让你也能快速地进行视频播放功能开发。 最后呢&#xff0c;我会提供一个鸿蒙中涉及的主要…...

QT----计算器

目录 1 搭建标准界面2、 逻辑编写2.1 初始化 github链接&#xff1a;基于qt的计算器 更多内容可以点击这里查看个人博客&#xff1a;个人博客 1 搭建标准界面 按照下图搭设界面 修改样式让这计算器看起来更像一点&#xff0c;同时对按钮分组进行样式编辑&#xff0c;添加字符…...

Linux:kubernetes(k8s)Deployment的操作(13)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…...

20240619-James-快速鸟瞰并发编程, 呕心沥血整理的架构技术(第3篇)

接着第1, 2篇后&#xff0c;我们继续来跟进一下并发编程的其它内容&#xff0c;如下&#xff1a; 第9节 java.util.concurrent包 线程池 线程池的核心接口是ExecutorService。java.util.concurrent还提供了一个静态工厂类Executors&#xff0c;其中包含用于创建配置线程池的…...

C语言——详解字符函数和字符串函数(一)

Hi,铁子们好呀&#xff01;今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下&#xff1a; 文章目录 &#x1f386;1.字符分类函数&#x1f4af;&#x1f4af;⏩1.1 什么是字符分类函数的&#xff1f;&#x1f4af;&#x1f4af;⏩1.2 字符函数的类型有哪…...

三款内衣洗衣机的顶级较量:希亦、小吉、由利,谁才是性价比之王?

洗衣机在我们的生活中可谓是非常常见的了&#xff0c;几乎每家每户都具备着一台。即便是有洗衣机&#xff0c;也有不少人不会将自己我贴身衣物直接扔在洗衣机里清洗&#xff0c;而是会自己手工手洗。这跟我们传统上的观念有很大的关系&#xff0c;认为把内衣、内裤等贴身衣物放…...

Java枚举多值映射应用

在日常系统交互中&#xff0c;经常遇到两个系统间定义的枚举不一致&#xff0c;在接口调用时需要转换&#xff0c;记录实现&#xff0c;方便备查。 场景 双方的支付方式定义不同&#xff0c;一侧为数字&#xff0c;一侧为英文&#xff0c;若使用 if 判断&#xff0c;则显得繁琐…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...