Java每日面试题(JVM)(day15)

news2024/9/28 0:07:07

目录

  • Java对象内存布局
  • markWord 数据结构
  • JDK1.8 JVM 内存结构
  • JDK1.8堆内存结构
  • GC垃圾回收
    • 如何发现垃圾
    • 如何回收垃圾
  • JVM调优参数

Java对象内存布局

Java对象内存布局

markWord 数据结构

markWord数据结构

JDK1.8 JVM 内存结构

JVM内存模型
在这里插入图片描述

  • 程序计数器:
    线程私有,记录代码执行的位置.

  • Java虚拟机栈:
    线程私有,每个线程都有一个自己的Java虚拟机栈 ,默认大小是1M

  • 本地方法栈:
    线程私有,每个线程都有一个自己的本地方法栈,Java虚拟机栈加载的是普通方法,本地方法加载的是native修饰的方法.

    native:表示这个方法不是java原生的,是由C或C++实现的

  • :
    线程共享用于存放对象,new的对象都存储在这个区域

  • 元空间:
    线程共享,存储class信息,类的信息,方法的定义,静态变量常量池

  • 堆和元空间是线程共享的,在Java虚拟机中只有一个堆一个元空间,并在JVM启动的时候就创建,JVM停止才销毁。
  • 栈、本地方法栈、程序计数器是每个线程私有的,随着线程的创建而创建,随着线程的结束而死亡。

每个存储位置会产生的异常
每个位置可能会产生的错误

JDK1.8堆内存结构

堆内存结构

  • 年轻代:Eden+S0+S1, S0和S1大小相等, 新创建的对象都在年轻代
  • 老年代:经过年轻代 多次垃圾回收存活下来的对象存在年老代中.

GC垃圾回收


JVM的垃圾回收动作可以大致分为两大步:

  1. 如何发现垃圾
  2. 如何回收垃圾

线程私有的不存在垃圾回收,只有线程共享的才会存在垃圾回收,所以堆中存在垃圾回收.

如何发现垃圾


常见的用于「发现垃圾」的算法有两种,引用计数算法根搜索算法

  1. 引用计数算法
    堆中的对象每被引用一次,则计数器加1,每减少一个引用就减1,当对象的引用计数器为0时可以被当作垃圾收集。

    • 优点:快。
    • 缺点:无法检测出循环引用。如两个对象互相引用时,他们的引用计数永远不可能为0。
  2. 根搜索算法(也叫根可达性分析)
    根搜索算法是把所有的引用关系 看作一张图,从根节点(GCRoot)开始遍历,找出被根节点引用的节点,对于没有被根节点指向的节点,即可以当作垃圾。

    • Java中可作为GCRoot的对象有:
      1. java虚拟机栈中引用的对象
      2. 本地方法栈引用的对象
      3. 元空间中静态属性引用的对象
      4. 元空间中常量引用的对象

如何回收垃圾


Java中用于「回收垃圾」的常见算法有4种:

  1. 标记-清除算法(markandsweep)
    首先标记出所有需要回收的对象,在标记完成之后统一回收掉所有被标记的对象。

    缺点: 标记清除之后会产生大量的不连续的内存碎片

  2. 标记-整理算法
    首先标记出所有需要回收的对象,让所有存活的对象移动到另一个位置,在移动过程中清理掉可回收的对象,这个过程叫做整理

    优点:内存被整理后不会产生大量不连续内存碎片
    缺点:耗时耗力

  3. 复制算法(copying)
    将空间分成大小相等的两块,每次只使用其中一块,当这块内存使用完了,就将存活的对象复制到另一块内存上去,然后把使用过的内存空间一次清理掉。

    缺点:可使用的内存只有原来一半。在某一个时刻点,总有一个 S 是空的,可能是S0 也可能是S1.。

  4. 分代收集算法(generation)
    当前主流JVM都采用分代收集(GenerationalCollection)算法,这种算法会根据对象存活周期的不同将内存划分为年轻代、年老代,不同生命周期的对象可以采取不同 的回收算法,以便提高回收效率。

    • 年轻代(YoungGeneration)

      1. 所有新生成的对象首先都是放在年轻代的。
      2. 新生代内存按照8:1:1的比例分为一个eden区和两个Survivor(s0,s1)区。大部分对象在Eden区中生成。

      回收流程:
      回收时先将eden区存活的对象复制到一个s0区,然后清空eden区,当这个s区,也存放满了时,则将eden区和s0区存活对象复制到另一个s1区,然后清空eden和这个s0区,此时s0区是空的,然后将s0区和s1区交换,即保持s1区为空,如此往复.

      1. 特殊情况:当一个大对象不足于存放到eden区时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次FullGC,也就是新生代、老年代都进行回收。

      2. 新生代发生的GC也叫做MinorGC,MinorGC发生频率比较高

    • 年老代(OldGeneration)

      1. 在年轻代中经历了 N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。默认是15次,且最大15次。

      2. 内存比新生代也大很多(大概是2倍),当老年代内存满时触发FullGC,
        FullGC发生频率比较低,老年代对象存活时间比较长,存活率比较高。

    • 元空间-持久代(PermanentGeneration)
      用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响。

JVM调优参数

这里只给出一些常见的性能调优的参数及其代表的含义。

-Xms8g: 设置JVM中堆初始堆大小为8g。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmx8g: 设置JVM中堆最大可用内存为8g。

-Xmn4g: 设置年轻代大小为4G。

-XX:NewRatio=2 设置年轻代(包括Eden和两个Survivor区)与年老代的比值。设置为2,则年轻 代与年老代所占比值为1:2,年轻代占整个堆栈的1/3。

-XX:SurvivorRatio=8 ,所以默认值 Eden:S0:S1=8:1:1。

-Xss1m:设置每个线程的栈大小

-XX:MaxMetaspaceSize=128m: 设置元空间最大为为128m ,

-XX:MetaspaceSize=128m 用于设置元空间的初始大小, 默认值约21M

-XX:MaxTenuringThreshold=15:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。 对于年老代比较多的应用,可以提高效率。最大不超过15。

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

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

相关文章

服务器操作系统【sar 命令】

sar 安装、语法参数说明以及示例 文章目录 功能概述一、功能介绍1.安装配置2. 配置3. 启动二、sar 语法及参数说明三、示例及释义1.汇报 io 传输速率信息2.内存分页信息3.块设备状态信息4.hugepages 利用率统计信息5.列长度和负载平均值6.内存利用率统计信息7.swap 交换空间利用…

中国的互联网电商,终于还是“连上了”

什么才是更好的互联网? 答案很简单:真正的互联。 9月26日,据市场消息,京东物流和菜鸟速递将分别接入淘天、京东平台。同时,京东也将在“双11”前开通支付宝支付,时隔13年再度携手阿里支付体系。 消息一出…

【Redis入门到精通八】Redis事务与MySQL事务对比

目录 事务 1.MySQL中事务的特性 2.Redis事务与MySQL事务的区别 3.Redis事务操作演示 事务 什么是事务呢?事务的概念其实就是把一系列操作绑定成一组,让这一组操作能够批量执行,不过在MySQL中有复杂的机制能够保证这一组操作执行并且一定能…

降AI率不再难:芝士AI去痕工具,让论文原创性飙升~~~

降AI率不再难:芝士AI去痕工具,让你的论文原创性飙升 如何有效降低AIGC论文的重复率,也就是我们说的aigc如何降重?AIGC疑似度过高确实是个比较愁人的问题。 如果你用AI帮忙写了论文,就一定要在交稿之前做一下AIGC降重…

征程6 上基于 DEB 工具实现包管理

1.引言 在开发、调测过程中,开发人员需要将系统软件、应用软件部署到 Soc 板端,以用于运行调试。传统的部署方式是通过解压复制或者调用部署脚本。这样的部署方式需要有着方式不统一、维护投入大的缺点。 在 linux 系统上,大多采用包管理的…

【CSS】背景

background-color 颜色background-image 图像background-size 缩放background-repeat 平铺background-position 定位background-clip 裁剪区域background-origin 开始区域background-attachment 滚动方式 background-color 颜色 <style>div{width: 200px;height: 100px;…

TOF系列—深度图滤波

本篇文章主要介绍TOF深度图的后处理&#xff0c;鉴于自身水平所限&#xff0c;如有错误&#xff0c;欢迎批评指正。&#xff08;欢迎进Q群交流&#xff1a;874653199&#xff09; TOF由于其本身的特性&#xff0c;导致其所获得的深度图存在以下问题&#xff1a; 1.对空的地方存…

SpringBoot与MyBatis-Plus的整合与综合实例

MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程、以及高级映射。MyBatis3 提供的注解可以取代 XML。例如&#xff0c;使用注解 Select 直接编写 SQL 完成数据查询。MyBatis-Plus 是一个对 MyBatis 进行增强的工具&#xff0c;在 MyBatis 的基础上只做增…

剑指 offer 刷题集

目录 数组 1. LCR 121. 寻找目标值 - 二维数组 2. LCR 120. 寻找文件副本 3. LCR 128. 库存管理 I 4. LCR 131. 砍竹子 I 5. LCR 132. 砍竹子 II 6. LCR 135. 报数 7. LCR 139. 训练计划 I 8. LCR 158. 库存管理 II 9. LCR 159. 库存管理 III 10. LCR 160. 数据流中…

从GPS接收机灵敏度出发--理论计算GPS最低的跟踪灵敏度

思博伦售后团队 对射频工程师来说&#xff0c;自己设计的接收机灵敏度&#xff08;Receiver Sensitivity&#xff09;是最关注也是最重要的参数之一。所以我们首先来看看接收机灵敏度的定义&#xff1a; 在满足一定误码率的条件下&#xff0c;接收机能容许接受到的最小信号电平…

FPGA学习(3)-38译码器实现

目录 1.38译码器概述 2.VIVADO步骤 2.1创建工程&#xff0c;添加源文件 2.2添加仿真文件&#xff0c;并进行仿真 ​2.3添加管脚约束 2.4生成bit文件 2.5 烧录程序 3.实验结果 1.38译码器概述 即三个输入A2A1A0&#xff0c;输出的十进制数&#xff0c;例如LHL(010)2…

class 026 哈希表、有序表和比较器的用法

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. https://space.bilibili.com/8888480?spm_id_f…

Docker实践与应用:深度探索与丰富案例

一、引言 在当今的软件开发和运维领域&#xff0c;Docker已经成为了一种不可或缺的技术。它以容器化的方式改变了软件的开发、部署和运行模式&#xff0c;为企业和开发者带来了前所未有的便利和效率提升。本文将深入探讨Docker的实践操作以及丰富的应用举例&#xff0c;带您全面…

点餐小程序实战教程12菜品展示

目录 1 点餐界面2 显示菜品分类2.1 创建变量2.2 数据绑定 3 显示菜品总结 我们上一篇介绍了数据源的设计方法&#xff0c;讲解了菜品分类和菜品数据源的创建以及后台功能的开发。有了后台功能并且准备好数据之后&#xff0c;我们就需要开发小程序部分。 现实中你看到的想到的绝…

基于SpringBoot+Vue3的在线报名系统

一、项目介绍 1.1 项目介绍 本项目为一个报名系统&#xff0c;实现了基本的报名流程&#xff0c;功能完善&#xff0c;前后端皆有个人独立开发&#xff0c;功能相对不是特别难&#xff0c;但该有的功能还是都已经实现。 1.2 技术架构 主要技术栈&#xff1a; SpringBoot2 …

【LLM学习之路】9月25日26日27日 第十二、十三、十四天 Transformer Encoder

【LLM学习之路】9月25日26日27日 第十二、十三、十四天 Transformer Encoder Encoder 负责将输入的词语序列转换为词向量序列&#xff0c;Decoder 则基于 Encoder 的隐状态来迭代地生成词语序列作为输出&#xff0c;每次生成一个词语。 王木头 词向量&#xff0c;使用高维向…

教师工作量|基于springBoot的教师工作量管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff…

论文笔记(四十七)Diffusion Policy: Visuomotor Policy

Diffusion Policy: Visuomotor Policy 文章概括摘要1. 介绍2. 扩散策略的公式化2.1 去噪扩散概率模型2.2 DDPM 训练2.3 用于视觉运动策略学习的扩散模型 3 关键设计决策3.1 网络架构选项3.2 视觉编码器3.3 噪声计划3.4 加速实时控制的推理 4. 扩散策略的四个引人入胜的特性4.1 …

Meta号称替代程序员的LlamaCoder效果被CodeFlying秒杀,来看实测!

在讲LlamaCoder之前咱先浅聊一下Meta 这两天Meta凭借着Connect 2024大会可谓是风头正盛&#xff0c;刚刚发布的全新开源多模态大模型Llama3.2&#xff0c;热度是一路赶超咱的小草莓啊。 作为一款开源大模型能够和闭源的4o-mini、Claude3 Haiku打的有来有回&#xff0c; 甚至L…

protobuf编码方式

protobuf编码方式 一个简单的例子 message Test1 {optional int32 a 1; }上述的proto文件&#xff0c;设置a 150&#xff0c;那么将其序列化后&#xff0c;得到的数据就是08 96 01&#xff0c;然后你使用protoscope工具去解析这些数据&#xff0c;就得到1 : 150&#xff0c…