Jvm相关知识(面试高级必备)

  • 类的实例化顺序

先静态、先父后子

先静态:父静态>子静态

优先级:父类>子类 静态代码块>非静态代码块>构造函数

一个类的实例化过程:

①.父类的static代码块,当前类的static;

②.顺序执行父类的普通代码块;

③.父类的构造函数;

④.子类的普通代码块;

⑤.子类(当前类)的构造函数,按顺序执行;

⑥.子类方法的执行;

  • jvm内存分配

根据jvm规范,jvm内存共分为虚拟机栈、堆、方法区、程序计数器和本地方法栈五个部分。
在这里插入图片描述

  1. .方法区:主要存储类信息,常量池(static常量和static变量),编译后的代码(字节码)等信息;

  2. .堆:初始化的对象,成员变量(非static变量),所有的对象实例和数组都要在堆上分配;

  3. .栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上存储局部变量表,操作数栈,方法出口等信息,局部变量表存放的是八大基础类型加一个应用类型,所以还是一个指向地址的指针;

  4. .程序技术器:记录当前线程执行的行号;

  5. .本地方法栈:主要为Native方法服务。

Java8的内存分带改进

从永久代到元空间,在小范围自动拓展永生代避免溢出。

JVM垃圾回收机制,何时触发MinorGC等操作
分代垃圾回收机制:不同的对象生命周期不同。把不同生命周期的对象放在不同代上,不同代上采用最合适的垃圾回收方式进行回收。

JVM中共划分为三个代:年轻代、年老代和持久代。

年轻代:存放所有新生成的对象;

年老代:在年轻代中经历了N次垃圾回收仍然存活的对象,将被放在年老代中,故都是一些生命周期较长的对象;

持久代:用于存放静态文件,如Java类、方法等。

新生代的垃圾回收器命名为“Minor Gc”,老生代的垃圾回收器命名为“Full Gc 或 Major Gc”。其中在System.gc()强制执行的是Full Gc。

判断对象是否需要回收的两种方法:

①.引用计数

当某个对象的引用数为0时,便可以进行垃圾回收。

这种方法的最大缺点是无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,它们的引用计数 永远也不可能为0.

②.可达性分析算法

可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看做一张图,从一个节点GC ROOT开始,寻找对应的引用节点找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有引用的节点,即无用的节点,无用的节点将会被判定为垃圾回收的对象。
在这里插入图片描述

  • 触发GC的条件

①.GC在优先级最低的线程中运行,一般在没有应用程序即没有应用线程在运行时被调用;

②.Java堆内存不足时,GC会被调用。

  • JVM中完整的GC流程

①.对象优先在新生代中分配,如果内存不足,Minor GC;

②.大对象(需要大量连续内存空间)直接进入老年代;长期存活的对象进入老年代。如果对象在新生代经过一次 Minor GC回收仍然存活,年龄+1.若年龄超过一定限制(15),则晋升为老年代。

  • 你知道哪几种垃圾回收器,各自的优缺点是什么?
    在这里插入图片描述

Eden和Survivor的分配比例

默认比例8:1。大部分对象都是朝生夕死。

复制算法的基本思想就是将内存分为两块,每次只使用其中的一块,当这一块内存用完,就会将活着的对象复制到另一块上。复制算法不会产生内存碎片。

Java内存模型,以及在并发中的应用

Java内存模型的主要目标:定义程序中各个变量的访问规则。

Java 线程之间的通讯有java内存模型控制。

所有变量的存储都在主内存,每个线程都有自己的工作内存,线程的工作内存中保存了被线程引用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,不同的线程之间无法直接访问对方工作内存中的变量,线程之间变量的传递必须通过主内存来传递。
在这里插入图片描述
线程间的通讯:

①.首先,线程A把本地内存中更新的变量刷新到主内存中;

②.然后,线程B在主内存中读取线程A已经更新过的变量。

  • volatile的语义,用volatile修饰的变量一定是线程安全吗?

一个变量被定义为volatile后,有两重含义:

①.保证此变量对所有线程的可见性,当一个线程修改了此变量,新值对于其它线程都是立即得知的,普通变量需要通过主内存来传递;

②.禁止指令的重排优化。

Valtile 修饰的变量不一定是线程安全的,eg非原子操作a++等。

对象之间的引用有哪些?

对象之间的引用主要有:强引用、弱引用、软引用和虚引用。

强引用:new出的对象之间的引用,只要强引用还在,就永远不会被回收;

弱引用:非必须的对象,对象能存活到下一次垃圾收集之前;

软引用:引用但非必须的对象,内存溢出异常之前回收;

虚引用:对生存时间无影响, 在垃圾回收事得到通知。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线程池的简单介绍及使用

线程池 线程池的参数介绍拒绝策略 线程池的任务处理流程使用Executors创建常见的线程池 线程池的参数介绍 corePoolSize: (核心线程数)这是线程池中始终存在的线程数,即使这些线程处于空闲状态。maximumPoolSize:(最大线程数) 是线程池允许的最大线程数。keepAliveT…

【动态规划】【C++算法】741摘樱桃

作者推荐 【动态规划】【数学】【C算法】18赛车 涉及知识点 动态规划 LeetCode741 摘樱桃 给你一个 n x n 的网格 grid ,代表一块樱桃地,每个格子由以下三种数字的一种来表示: 0 表示这个格子是空的,所以你可以穿过它。 1 表…

EasyRecovery2024数据恢复大师最新版本下载

EasyRecovery可以从初始化的磁盘恢复损坏或删除的文件。该软有易于使用,即使是最缺乏经验的用户也可以轻松恢复数据。一款威力非常强大的硬盘数据恢复工具。能够帮你恢复丢失的数据以及重建文件系统。EasyRecovery 不会向你的原始驱动器写入任何东东,它主…

深入探索 Android 中的 Runtime

深入探索 Android 中的 Runtime 一、什么是 Runtime二、Android 中的 Runtime 类型2.1. Dalvik Runtime2.2. ART(Android Runtime) 三、Runtime 的作用和特点3.1. 应用程序执行环境3.2. 跨平台支持3.3. 性能优化3.4. 应用程序优化 四、与应用开发相关的重…

论rtp协议的重要性

rtp ps流工具 rtp 协议,实时传输协议,为什么这么重要,可以这么说,几乎所有的标准协议都是国外创造的,感叹一下,例如rtsp协议,sip协议,webrtc,都是以rtp协议为基础&#…

【react】创建react项目+项目结构

使用create-react-app快速搭建开发环境 create-react-app是一个快速创建React开发环境的工具,底层由Webpack构建,封装了配置细节 npx create-react-app react_hm执行命令后开始创建 创建好执行cd react_hm npm start 当看到webpack compiled successfu…

zookeeper window 安装

下载 Apache ZooKeeper 解压Zookeeper安装包到指定目录,注意目录不要有空格。 备份zoo_sample.cfg并改名zoo.cfg 注意:此处的路径一定要使用双斜杠" \\ " D:\\apache-zookeeper-3.8.3-bin\\data 新建环境变量:ZOOKEEPER_HOME D…

Kafka Console Client 的 Consumer Group

以往使用 kafka-console-consumer.sh 消费 Kafka 消息时并没有太在意过 Consumer Group,在命令行中也不会使用 --group 参数,本文针对 Kafka Console Client 命令行中的 Consumer Group 进行一次统一说明。 1. 如不设置 --group 参数会自动生成一个 Con…

亚马逊云科技 WAF 部署小指南(六)追踪 Amazon WAF Request ID,排查误杀原因

众所周知,中国是全球制造业的巨大力量,许多中国企业通过 2B 电商平台网站进行商品销售和采购。在这些电商平台上,Web 应用防火墙(WAF)成为不可或缺的安全工具。然而,WAF 也可能导致误杀问题。一旦误杀发生&…

CodeReview 小工具

大家开发中有没有遇到一个版本开发的非常杂,开发很多个项目,改动几周后甚至已经忘了自己改了些什么,领导要对代码review的时候,理不清楚自己改过的代码,只能将主要改动的大功能过一遍。这样就很容易造成review遗漏&…

从技术大会到面试舞台:程序猿的蜕变之旅!

在这个技术日新月异的时代,程序员们需要不断地学习和提升自己的技能。 参加技术大会,无疑是程序员们拓宽视野、提升技能的重要途径之一。然而,技术大会只是程序员成长的一部分,掌握面试技巧同样至关重要。只有将这两者完美结合&a…

ubuntu-20.04.6-live-server-amd64安装教程-完整版

简介 Ubuntu 20.04.6 Live Server AMD64 安装教程 - 完整版" 提供了详细的指南,旨在帮助用户在使用 AMD64 架构的服务器上安装 Ubuntu 20.04.6 Live Server 版本。该教程包含全面的步骤和详细说明,使用户能够顺利完成整个安装过程,建立…

【AI的未来 - AI Agent系列】【MetaGPT】5. 更复杂的Agent实战 - 实现技术文档助手

在 【AI的未来 - AI Agent系列】【MetaGPT】2. 实现自己的第一个Agent 中,我们已经实现了一个简单的Agent,实现的功能就是顺序打印数字。 文章目录 0. 本文实现内容1. 实现思路2. 完整代码及细节注释 0. 本文实现内容 今天我们来实现一个有实际意义的Ag…

test0120测试1

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏:《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

项目实战————苍穹外卖(DAY11)

苍穹外卖-day11 课程内容 Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现:数据统计 数据统计效果图: 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观&#x…

小红书怎么种草?小红书种草玩法全攻略你不容错过!

小红书是一个以分享购物心得和生活方式为主题的社交平台,近年来已经成为了许多品牌进行宣传和推广的重要渠道。那么,品牌如何在小红书上种草,打造自己的形象呢?以下是一些实用的方法。 1.选择合适的KOL合作 在小红书上&#xff0…

完整的性能测试流程

一、准备工作 1、系统基础功能验证 性能测试在什么阶段适合实施?切入点很重要!一般而言,只有在系统基础功能测试验证完成、系统趋于稳定的情况下,才会进行性能测试,否则性能测试是无意义的。 2、测试团队组建 根据…

EasyRecovery2024免费电脑数据恢复软件下载

easyrecovery是一款功能强大、易于使用的硬盘数据恢复软件。这款软件可以帮助用户非常方便地恢复丢失的数据。软件非常容易使用和高效的数据恢复。感兴趣的朋友们赶快来下载吧。 无论是因为意外删除、格式化、病毒感染、系统崩溃还是其他原因,该软件可以帮助您恢复…

mybatis xml多表查询,子查询,连接查询,动态sql

项目结构 数据库表 student_type 表 student 表 依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><dependency><groupId>org.…

回溯算法篇-01:全排列

力扣46&#xff1a;全排列 题目分析 这道题属于上一篇——“回溯算法解题框架与思路”中的 “元素不重复不可复用” 那一类中的 排列类问题。 我们来回顾一下当时是怎么说的&#xff1a; 排列和组合的区别在于&#xff0c;排列对“顺序”有要求。比如 [1,2] 和 [2,1] 是两个不…