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

HS2-HF Patch:驱动创作自由的智能补丁系统与需求动态匹配技术

HS2-HF Patch&#xff1a;驱动创作自由的智能补丁系统与需求动态匹配技术 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 在游戏创作领域&#xff0c;玩家对个性…...

告别重复编码:用快马平台ai一键生成node.js效率工具脚本

最近在维护一个Node.js项目时&#xff0c;经常需要统计代码量。手动一个个文件查看实在太费时间&#xff0c;于是尝试用InsCode(快马)平台快速生成了一个代码统计工具&#xff0c;效果出乎意料地好。 需求分析 核心功能&#xff1a;需要递归扫描目录下的所有.js文件&#xff…...

PP-DocLayoutV3参数详解:text/title/table/figure等11类版面区域置信度解析

PP-DocLayoutV3参数详解&#xff1a;text/title/table/figure等11类版面区域置信度解析 1. 引言&#xff1a;为什么版面分析需要“置信度”&#xff1f; 想象一下&#xff0c;你拿到一份扫描的合同&#xff0c;想用OCR&#xff08;文字识别&#xff09;把它变成可编辑的电子版…...

避坑指南:OpenBMI运动想象实验中的‘跨被试’与‘不跨被试’到底怎么选?

避坑指南&#xff1a;OpenBMI运动想象实验中的‘跨被试’与‘不跨被试’到底怎么选&#xff1f; 当你第一次接触OpenBMI工具箱进行运动想象&#xff08;Motor Imagery, MI&#xff09;实验时&#xff0c;最令人困惑的决策之一就是如何选择数据划分策略。是采用**跨被试&#xf…...

PyTorch模型转ONNX避坑指南:从repeat_interleave到Concat类型匹配的实战解决方案

PyTorch模型转ONNX避坑指南&#xff1a;从动态张量到类型匹配的深度解决方案 在模型部署的最后一公里&#xff0c;PyTorch到ONNX的转换常常成为绊倒开发者的隐蔽陷阱。当你在本地训练环境获得完美指标后&#xff0c;准备将模型推向生产时&#xff0c;各种意想不到的导出错误可能…...

QueryExcel:解放双手的Excel批量查询神器,告别Ctrl+F的繁琐时代

QueryExcel&#xff1a;解放双手的Excel批量查询神器&#xff0c;告别CtrlF的繁琐时代 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 在日常工作中&#xff0c;你是否也曾被海量Excel文件中的数据查找…...

Z-Image-Turbo问题解决:手把手教你配置Gradio WebUI并映射本地端口

Z-Image-Turbo问题解决&#xff1a;手把手教你配置Gradio WebUI并映射本地端口 1. 为什么选择Z-Image-Turbo 如果你正在寻找一款既快速又高质量的AI图像生成工具&#xff0c;Z-Image-Turbo绝对值得考虑。这个由阿里通义实验室开源的高效文生图模型&#xff0c;在速度和质量的…...

158页精品PPT | 某大型研发制造集团信息化IT规划整体方案

许多公司在数字化转型过程中会遇到一些共同的挑战&#xff0c;比如数据孤岛、技术更新慢、员工技能不足等。这些问题会导致企业效率低下&#xff0c;难以适应市场变化。针对这些问题&#xff0c;我们提出了一套解决方案&#xff0c;核心目标是帮助企业提升数字化水平&#xff0…...

新手如何借助快马平台AI生成代码,轻松入门蓝桥杯经典题型

作为一个刚接触编程的新手&#xff0c;参加蓝桥杯这样的比赛可能会觉得无从下手。特别是看到题目要求实现算法时&#xff0c;往往不知道如何把问题拆解成代码。最近我发现用InsCode(快马)平台可以很好地解决这个问题&#xff0c;它能根据题目描述直接生成可运行的代码&#xff…...

租车宝 token、payload算法分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 部分python代码 url "/queryOr…...