Java面试之JVM之内存模型

news2024/9/27 10:22:55

说一下JVM内存模型及分区,每个区放什么?

JVM分为:

  • 堆区
  • 栈区
  • 方法区

①方法区:主要是存储类信息,常量池(static量和 static变量),编译后的代码(字节码)等数据
②堆:初始化的对象,成员变量(那种非 static的变量),所有的对象实例和数组都要在堆上分配
③栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,局部变量表存放的是8大基础类型加上一个引用类型,所以还是一个指向地址的指针
④本地方法栈:主要为 Native方法服务
⑤程序计数器:记录当前线程执行的行号

总结:初始化的对象放在堆里面,引用放在栈里面,class类信息常量池(static常量和 static变量)等放在方法区

JVM内存区域主要分为:

  • 线程私有区(程序计数器、虚拟机栈、本地方法区)
  • 线程共享区(Java堆、方法区)
  • 直接内存

说一下Java内存分配?

  • 寄存器:无法控制。
  • 静态域:static定义的静态成员。
  • 常量池:编译时被确定并保存在. class文件中的final常量值和一些文本修饰的符号引用(类和接口的全限定名,字段的名称和描述符,方法和名称和描述符)。
  • 非RAM存储:硬盘等永久存储空间。
  • 堆内存:new创建的对象和数组,由Java虚拟机自动垃圾回收器管理,存取速度慢。
  • 栈内存:基本类型的变量和对象的引用变量(堆内存空间的访问地址),速度快,可以共享,但是大小与生存期必须确定,缺乏灵活性。

新生代中为什么要分为Eden和Survivor?

如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC.老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多,所以需要分为Eden和Survivor。
Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。
设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)

对象如何晋升到老年代?

1、大对象直接进入老年态

2、经过一次Minor GC,年龄+1,若年龄超过一定限制(15),则被晋升到老年态。即长期存活的对象进入老年态

元数据区存放的是什么?会oom吗?

Perm Space中保存的是加载class文件。

会引起OutOfMemory,出现异常可以设置 -XX:PermSize 的大小。

JDK 1.8后,字符串常量不存放在永久代,而是在堆内存中,JDK1.8以后没有永久代概念,而是用元空间替代,元空间不存在虚拟机中,二是使用本地内存。

JVM加载class原理?

JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。

由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。

类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:
①如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;
②如果类中存在初始化语句,就依次执行这些初始化语句。类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。

哪些区域可能会发生oom?

内存区域是否线程私有是否会发生OOM
程序计数器
虚拟机栈
本地方法栈
方法区
直接内存

Java堆的结构是什么样子的?

JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。

它在JVM启动的时候被创建。

对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。

堆内存是由存活和死亡的对象组成的。

存活的对象是应用可以访问的,不会被垃圾回收。

死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。

一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

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

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

相关文章

光耦——连接半导体创新的桥梁

半导体技术作为现代科技的重要支柱之一,在电子、通信、能源等领域都有着广泛的应用。而在半导体领域,光耦作为一种重要的光电器件,正以其独特的优势和广泛的应用领域,为半导体创新注入新的活力,成为连接半导体创新的桥…

IMX6UL开发板中断实验(三)

在上一节我们编写完成了中断驱动文件和中断驱动头文件,那么这一讲我们将继续中断实验 下面就是GPIO的中断设置,第一步要设置中断GPIO的触发方式,首先我们先看到寄存器,一共有GPIOx_ICR1和ICR2, 图如上,ICR1…

TortoiseGit 下载和安装

下载 1,下载路径 Download – TortoiseGit – Windows Shell Interface to Git 2,选择windows64的, 3,下载完成后 安装 1,双击运行,点击next 2,点击next 3,点击next 4&#xff0…

unity_Occlusion_Culling遮挡剔除学习

unity_Occlusion_Culling遮挡剔除学习 文档: https://docs.unity.cn/cn/2019.4/Manual/occlusion-culling-getting-started.html没彻底搞明白,但是会用,虽然也不熟练 设置遮挡剔除 打开遮挡剔除面板 设置场景物体。设置为静态 设置场景 烘…

ZYNQ:开发环境搭建

资料下载 http://47.111.11.73/docs/boards/fpga/zdyz_qimxing(V2).html Vivado软件是什么? Vivado软件是Xilinx(赛灵思)公司推出的一款集成设计环境(IDE),主要用于FPGA(现场可编程门阵列&am…

【Spring】Spring Aop基础入门

一、AOP(Aspect-Oriented Programming: 面向切面编程) 将那些与业务无关,却为业务模块所共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装抽取成一个可重用的模块,这个模块被命名为“切面”(Aspect&#xff09…

【Linux系统编程】第二十四弹---从零到一:掌握进程替换的奥秘

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程程序替换 1.1、替换原理 1.2、替换函数 1.3、函数解释 1.4、命名理解 1.5、代码演示 1.5.1、execl调用举例 1.5…

线上环境排故思路与方法GC优化策略

前言 这是针对于我之前[博客]的一次整理,因为公司需要一些技术文档的定期整理与分享,我就整理了一下。(https://blog.csdn.net/TT_4419/article/details/141997617?spm1001.2014.3001.5501) 其实,nginx配置 服务故障转移与自动恢复也是可以…

九、子查询

文章目录 0. 引入1. 需求分析与问题解决1.1 实际问题1.2 子查询的基本使用1.3 子查询的分类1.3.1 分类方式11.3.2 分类方式2 2. 单行子查询2.1 单行比较操作符2.2 代码实例2.3 HAVING 中的子查询2.4 CASE中的子查询2.5 子查询中的空值问题2.6 非法使用子查询 3. 多行子查询3.1 …

FPGA实现PCIE图片采集转HDMI输出,基于XDMA中断架构,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图测试图片QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存Native视频时序生成RGB转HDMI输出模块Windows版本XDMA驱动安装Linux版本XDMA驱动安装工程源码…

awvs工具测试输出漏洞报告教程

1.登录进awvs 2.添加要扫描的网站url 3.这里选择生成新的报告 4.开始扫描 5.生成报告

Spring Boot 核心概念

1. 起步依赖 Spring Boot 提供了一系列以 spring-boot-starter- 为前缀的起步依赖,通过这些依赖,可以快速引入 Web、JPA、Security、Redis 等功能。例如: spring-boot-starter-web:包含 Web 开发常见的依赖,如 Sprin…

TypeScript 设计模式之【备忘录模式】

文章目录 备忘录模式:时光机器的魔法备忘录模式的奥秘备忘录模式有什么利与弊?如何使用备忘录模式来优化你的系统代码实现案例备忘录模式的主要优点备忘录模式的主要缺点备忘录模式的适用场景总结 备忘录模式:时光机器的魔法 想象一下,如果…

调用飞书接口导入供应商bug

1、业务背景 财务这边大部分系统都是供应商项目,由于供应商的研发人员没有飞书项目的权限,涉及到供应商系统需求 财务这边都是通过多维表格进行bug的生命周期管理如图: 但多维表格没有跟飞书项目直接关联,测试组做bug统计的时候无…

【Docker】01-Docker常见指令

1. Docker Docker会下载镜像,运行的时候,创建一个隔离的环境,称为容器。 docker run -d \ # 创建并运行一个容器,-d表示后台运行 --name mysql \ # 容器名称-p 3307:3306 \ # 端口映射,宿主机端口映射到容器端口-e TZ…

打造同城O2O平台:外卖跑腿APP的架构与功能设计详解

今天,小编将于大家共同讨论外卖跑腿APP的架构设计及其核心功能,旨在为开发者提供一份详尽的参考。 一、外卖跑腿APP的架构设计 1.整体架构概述 通常包括前端、后端和数据库。 2.前端设计 用户端提供直观的界面,方便用户下单、查询订单状态…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于自适应时段划分的含氢微能网中长期变分辨率调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Rust gRPC---Tonic实战

API 一个API做了两件事 客户端发起请求Request服务端作出响应Response REST是什么 REST(Representational State Transfer):表现层状态传输,是一种设计风格,通常将 HTTP API 称为 RESTful API、RESTful 服务或 RES…

AI大模型生态暨算力大会今日举行,20位大咖领衔共探「AI NATIVE,生成未来」

出品|AI大模型工场 9月25日消息,由AI大模型工场主办AI大模型生态暨算力大会今日举行。作为国内最具影响力与最懂大模型的AI生态大会,大会讨论了AI大模型的最新进展和未来发展趋势。 2024年被业内称为大模型应用落地元年,大模型产…

【入门01】arcgis api 4.x 创建地图、添加图层、添加指北针、比例尺、图例、卷帘、图层控制、家控件(附完整源码)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title></title><link rel"s…