JVM面试真题总结(十二)

news2024/9/21 0:04:38

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

对比Java内存模型与JVM内存模型的不同点

Java内存模型(Java Memory Model,简称JMM)和JVM内存模型是两个不同的概念

  • 它们关注的问题和解决的问题是不同的。

Java内存模型:

  • Java内存模型主要关注的是多线程环境下,如何以线程安全的方式对共享变量进行操作。
  • 它定义了变量的读取、写入等操作的规则,并规定了在并发环境下
    • 如何通过volatile、synchronized等关键字来保证共享变量的可见性和有序性。
  • Java内存模型解决的是在多线程编程中,如何保证内存的可见性、原子性和有序性,以防止出现数据不一致的问题。

JVM内存模型:

  • JVM内存模型主要关注的是JVM的内存区域划分和内存管理。
    • 它将JVM内存划分为堆内存、栈内存、方法区、程序计数器等区域,并定义了每个区域的使用方式和作用。
    • 比如,堆内存主要用于存储对象实例,栈内存用于存储局部变量,方法区用于存储已被加载的类信息等。
      • JVM内存模型主要解决的是内存的分配和回收问题。

总的来说,Java内存模型主要是为了解决多线程编程中的内存可见性和有序性问题

  • 而JVM内存模型则是关注JVM如何管理和分配内存。

Java 8的内存结构有哪些显著变化?

在Java 8中,内存结构相较于之前的版本有一些变化。

主要的变化在于永久代(PermGen)被移除,取而代之的是元空间(Metaspace)。

以下是关于这两者的详细解释:

永久代(PermGen):

  • 在Java 7及其之前的版本中,永久代主要用于存储类的元数据、静态变量以及方法区等。
  • 永久代的内存大小是有限的,当加载的类过多时
    • 可能会导致永久代内存溢出(java.lang.OutOfMemoryError: PermGen space
      • 这在实际应用中是一个常见的问题。

元空间(Metaspace):

  • 在Java 8中,永久代被移除,取而代之的是元空间。
  • 元空间与永久代的主要区别在于它的内存分配。
    • 元空间并不位于Java堆内存中,而是使用本地内存(Native Memory)。
    • 这意味着元空间的大小不再受到Java堆内存的限制,而是受到本地内存的限制,这有助于减少永久代内存溢出的问题。
    • 当然,元空间也并非无限大,当元空间的内存分配超出限制时
      • 仍然会抛出内存溢出异常(java.lang.OutOfMemoryError: Metaspace)。

除了上述变化外,Java 8中的内存结构大致保持不变,包括Java堆、栈、程序计数器、本地方法栈等。

Java堆主要用于存储对象实例,栈用于存储局部变量、方法调用等,程序计数器用于存储当前线程的执行位置

  • 本地方法栈用于支持本地方法的调用。

总结一下,Java 8中的内存结构变化主要是将永久代替换为元空间

  • 这有助于解决永久代内存溢出的问题,同时使得内存分配更加灵活。

在实际应用中,我们需要关注元空间的内存使用情况,以便在需要时进行调整。

为什么Java 8要移除永久代(PermGen)?

永久代(PermGen)在Java 8中被移除,主要是因为以下几个原因:

简化垃圾收集:

  • 在Java 7及其之前的版本中,永久代存储了大量的类的元数据
    • 这使得垃圾收集器需要处理这部分内存,增加了垃圾收集的复杂性。
  • 移除永久代后,垃圾收集器只需要关注Java堆内存,从而简化了垃圾收集的过程。

避免内存溢出:

  • 永久代的内存大小是有限的,当加载的类过多时,可能会导致永久代内存溢出。
    • 而元空间使用的是本地内存,其大小只受限于本地内存的大小,因此更不容易出现内存溢出。

提高性能:

  • 永久代的内存管理需要消耗一定的性能。
    • 移除永久代后,可以减少内存管理的开销,从而提高系统的性能。

更好的内存控制和监控:

  • 永久代的内存分配和回收策略与Java堆不同,这使得对其进行控制和监控比较困难。
    • 而元空间使用的是本地内存,可以借助于本地内存管理工具进行更好的控制和监控。

总的来说,永久代被移除是为了简化垃圾收集,避免内存溢出,提高性能,以及实现更好的内存控制和监控。

对比堆内存和栈内存的特点和使用场景

堆和栈是Java内存中的两个重要区域,它们在内存分配、数据存储和生命周期等方面有以下主要区别:

内存分配:

  • 堆(Heap)是Java内存中用于存储对象实例的区域,它是一个运行时数据区,大小可动态扩展。
    • 堆内存由所有线程共享,因此在堆中分配的内存可以被所有线程访问。
  • 栈(Stack)是Java内存中用于存储局部变量、方法调用等的区域。
    • 每个线程都有一个独立的栈,栈内存由线程私有。
    • 栈的大小是固定的,当栈内存不足时,会导致栈溢出错误(java.lang.StackOverflowError)。

数据存储:

  • 堆中主要存储对象实例及其相关数据。
    • 当我们使用new关键字创建对象时,对象实例被分配到堆内存中。
  • 栈中主要存储基本数据类型(如int、float、boolean等)
    • 对象引用变量以及方法调用相关信息(如方法调用的顺序、局部变量等)。

生命周期:

  • 堆内存中的对象实例的生命周期较长。
    • 它们会在垃圾收集器运行时被回收,具体回收时机取决于垃圾收集器的策略。
  • 栈内存中的数据随着方法的调用和返回而创建和销毁。
    • 当一个方法执行结束后,该方法在栈中的局部变量和相关信息会被自动销毁。

访问速度:

  • 访问堆内存中的对象实例相对较慢,因为它涉及到查找对象引用以及处理垃圾收集等过程。
  • 访问栈内存中的数据相对较快,因为栈内存由线程私有,且其数据结构简单,方便存取。

总之,堆和栈的主要区别在于内存分配、数据存储和生命周期。

堆用于存储对象实例,大小可扩展,生命周期较长,访问相对较慢

而栈用于存储基本数据类型、对象引用变量和方法调用相关信息,大小固定,生命周期较短,访问相对较快。

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

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

相关文章

PyTorch 池化层详解

在深度学习中,池化层(Pooling Layer)是卷积神经网络(CNN)中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量,同时增强模型的鲁棒性。本文将详细介绍池化层的作用、种类、实现方法&#xf…

BLE 协议之物理层

目录 一、概述二、Physical Channel1、物理通道2、物理通道的细分 三、调制1、调制方式2、GFSK 四、发射机五、接收机六、收发机 一、概述 物理层(Physical Layer)是 BLE 协议栈最底层,它规定了 BLE 通信的基础射频参数,包括信号频…

Minio环境搭建(单机安装包、docker)(一)

前言: 项目中客户不愿意掏钱买oss,无奈只能给他免费大保健来一套。本篇文章只是记录验证可行性,毕竟minio太少文档了,参考着官网来。后面还会再出一套验证集群部署的文章。 一、资料 MinIO官网: MinIO | S3 Compatib…

Windows 安装 ZooKeeper 以及 IDEA 安装 zoolytic 连接工具

目录 前言 下载 解压 配置 启动服务 zoolytic 前言 在前公司做微服务开发时,使用的都是 Spring Cloud 的生态,服务的注册与发现中心用的 Eureka,也有使用 Nacos 的,远程调用则是用的 OpenFeign,换工作后&#x…

istio中serviceentry结合vs、dr实现多版本路由

假设有一个外部服务,外部服务ip为:10.10.102.90,其中32033为v1版本,32034为v2版本。 现在需要把这个服务引入到istio中,并且需要配置路由规则,使得header中x-version的值为v1的路由到v1版本,x-…

Gitee Pipeline 从入门到实战【详细步骤】

文章目录 Gitee Pipeline 简介Gitee Pipeline 实战案例 1 - 前端部署输入源NPM 构建Docker 镜像构建Shell 命令执行案例 2 - 后端部署全局参数输入源Maven 构建Docker 镜像构建Shell 命令执行参考🚀 本文目标:快速了解 Gitee Pipeline,并实现前端及后端打包部署。 Gitee Pi…

MYSQL数据库——MYSQL管理

MYSQL数据库安装完成后,自带四个数据库,具体作用如下: 常用工具 1.mysql 不是指mysql服务,而是指mysql的客户端工具 例如: 2.mysqladmin 这是一个执行管理操作的客户端程序,可以用它来检查服务器的配置和…

SpringMVC映射请求;SpringMVC返回值类型;SpringMVC参数绑定;

一,SpringMVC映射请求 SpringMVC 使用 RequestMapping 注解为控制器指定可以处理哪些URL请求 1.1RequestMapping修饰类 注解RequestMapping修饰类,提供初步的请求映射信息,相对于WEB应用的跟目录。 注: 如果在类名前&#xff0…

【车载开发系列】ParaSoft单元测试环境配置(三)

【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三)一. 去插桩设置Step1:静态解析代码Step2:编辑Parasoft文件Step3:确认去插桩二. 新增测试用例Step1:生成测试用例Step2:执…

【网络安全】Node.js初探+同步异步进程

未经许可,不得转载。 文章目录 Node.js 基础介绍NPM 包管理安装同步与异步fs 模块示例child_process 模块Node.js 基础介绍 Node.js 是运行在服务器端的 JavaScript 环境。它基于 Chrome 的 V8 引擎,拥有高效的执行性能。Node.js 采用事件驱动的 I/O 模型,使得它在处理高并…

策略路由与路由策略的区别

🐣个人主页 可惜已不在 🐤这篇在这个专栏 华为_可惜已不在的博客-CSDN博客 🐥有用的话就留下一个三连吧😼 目录 一、主体不同 二、方式不同 三、规则不同 四、定义和基本概念 一、主体不同 1、路由策略:是为了改…

苹果 2024 秋季新品发布会一文汇总:iPhone 16 / Pro 登场、手表耳机齐换代

✌ 作者名字:高峰君主 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 💬 人生格言:没有我不会的语言,没有你过不去的坎儿。💬 &#x1f5…

跟着DAMA学数据管理--数据管理框架

数据治理框架 数据治理框架是一套全面、系统的结构和方法,用于指导和管理组织内数据的整个生命周期,以确保数据的质量、可用性、安全性和一致性,从而实现数据的价值最大化。 它通常涵盖了一系列的策略、流程、组织架构、技术和标准。策略方面…

汽车电子笔记之-013:旋变硬解码ADI芯片AD2S1210使用记录(从零开始到软件实现)

目录 1、概述 2、技术规格 3、芯片引脚 4、旋变信号格式 5、使用过程只是要点分析 5.1、程序注意点分析 5.1.1、SPI配置时序 5.1.2、问题一:SPI时序问题 5.1.3、问题二:SPI读取时序(配置模式) 5.1.4、问题三&#xff1a…

canal消费binlog异常排查

canal简介 canal是一款优秀的订阅MySQL binlog的中间件,在MySQL异构数据到其它存储平台领域非常的实用好用。而且在数据表的迁移中也可以用canal订阅,然后将更新实时同步到新表。 原理 canal部署后伪装为一个MySQL slave节点向DB发起同步binlog请求&am…

Istio下载及安装

Istio 是一个开源的服务网格,用于连接、管理和保护微服务。以下是下载并安装 Istio 的步骤。 官网文档:https://istio.io/latest/zh/docs/setup/getting-started/ 下载 Istio 前往Istio 发布页面下载适用于您的操作系统的安装文件,或者自动…

系统架构-面向对象

有对象和没对象一样,鉴于今天中秋节 所以明天姐姐我就恢复单身了,忍这几个小时也没关系,一点不重要了

『功能项目』伤害数字UI显示【53】

我们打开上一篇52眩晕图标显示的项目, 本章要做的事情是在Boss受到伤害时显示伤害数字 首先打开Boss01预制体空间在Canvas下创建一个Text文本 设置Text文本 重命名为DamageUI 设置为隐藏 编写脚本:PlayerCtrl.cs 运行项目 本章做了怪物受伤血量的显示UI…

iOS 18 新功能:控制中心大變身!控制項目自由選配

蘋果於 Apple iOS 18 中為控制中心帶來大改變,變得更具有擴充性,而且將支援第三方應用的控制按鈕,中心內的組件大小也可調節。如今 iOS 18 正式上線,我們就可以試試控制中心不同項目自由選配帶來的效果。 組件可在三尺寸之間調整 …

十五、谷粒商城- 报错汇总

🌻🌻目录🌻🌻 一、谷粒商城- 分布式基础&环境搭建(1)1.1 项目构建完clean报错1.2 idea安装插件报错 二、谷粒商城- 快速开发之Spring Cloud Alibaba(2)2.1 配置完renren-fast 启…