当前位置: 首页 > 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;则显得繁琐…...

GTX 1050 Ti显卡的设备推理+模拟器运行时的显存占用实测报告!

...

Chandra AI企业知识管理方案:文档智能检索与摘要生成

Chandra AI企业知识管理方案&#xff1a;文档智能检索与摘要生成 1. 引言 企业每天都在产生海量文档——合同、报告、PPT、技术文档...这些宝贵的知识资产往往散落在各处&#xff0c;查找困难&#xff0c;利用率低。传统的关键词搜索就像在黑暗中摸索&#xff0c;找到的文档可…...

双向DC/DC全钒液流蓄电池充放电储能matlab/simulink仿真模型,采用双闭环控制...

双向DC/DC全钒液流蓄电池充放电储能matlab/simulink仿真模型&#xff0c;采用双闭环控制&#xff0c;充放电电流和电压均可控&#xff0c;直流母线端电压可控&#xff0c;电流为负则充电&#xff0c;电流为正则放电&#xff0c;可以控制电流实现充放电。 &#xff08;1&#xf…...

基于python的演唱会门票演出购票系统的设计与实现

目录同行可拿货,招校园代理 ,本人源头供货商用户管理模块演出信息管理购票与选座功能支付系统集成订单与票务管理数据分析与报表高并发优化项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商…...

Phi-4-mini-reasoning企业级落地:金融风控规则推理引擎构建案例

Phi-4-mini-reasoning企业级落地&#xff1a;金融风控规则推理引擎构建案例 1. 项目背景与模型介绍 在金融风控领域&#xff0c;规则推理引擎是核心决策系统的重要组成部分。传统规则引擎往往面临维护成本高、灵活性差、难以应对复杂场景等问题。Phi-4-mini-reasoning作为一款…...

Pixel Aurora Engine效果展示:青蓝+明黄配色系像素画作视觉冲击力解析

Pixel Aurora Engine效果展示&#xff1a;青蓝明黄配色系像素画作视觉冲击力解析 1. 视觉震撼力解析 Pixel Aurora Engine通过精心设计的青蓝明黄配色方案&#xff0c;创造出极具视觉冲击力的像素艺术作品。这种色彩组合源自经典16位游戏的美学理念&#xff0c;但通过现代AI技…...

新手避坑指南:PX4飞控连接TFmini、LIDAR Lite V3等定高雷达的完整接线与参数配置(QGC实操)

PX4飞控与定高雷达实战&#xff1a;从接线到参数配置的避坑指南 刚拿到PX4飞控和一堆传感器的新手们&#xff0c;面对密密麻麻的接口和参数设置&#xff0c;是不是有种无从下手的感觉&#xff1f;特别是当你需要连接定高雷达时&#xff0c;不同品牌&#xff08;北醒TFmini、LID…...

千问3.5-2B在办公提效场景:会议白板照片文字提取+要点总结实战

千问3.5-2B在办公提效场景&#xff1a;会议白板照片文字提取要点总结实战 1. 办公场景的痛点与解决方案 1.1 会议记录的传统困境 每次开完会&#xff0c;最让人头疼的就是整理会议记录了。特别是那些在白板上写满讨论要点的会议&#xff0c;你需要&#xff1a; 对着白板照片…...

保姆级万物识别教程:阿里开源镜像快速部署,识别图片超简单

保姆级万物识别教程&#xff1a;阿里开源镜像快速部署&#xff0c;识别图片超简单 1. 开篇&#xff1a;为什么选择这个镜像&#xff1f; 今天给大家介绍一个特别实用的AI工具——阿里开源的"万物识别-中文-通用领域"镜像。这个镜像最大的特点就是简单易用&#xff…...

Vision Transformer在timm中的实现与优化

Vision Transformer在timm中的实现与优化 【免费下载链接】pytorch-image-models The largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Visi…...