java面试——JVM(内存结构、垃圾回收、内存溢出)

4 篇文章 0 订阅


虚拟机

JVM内存结构

在这里插入图片描述

  • 方法区:存放类的信息

  • 堆:存放对象的信息

  • 虚拟机栈:存储方法内的局部变量、方法参数、线程

  • 程序计数器:记录程序当前进程

  • 哪些区域可能产生内存溢出?

  • 除程序计数器外,都有可能产生内存溢出

  • 出现 OutOfMemoryError 的情况

    • 堆内存耗尽:对象越来越多,且一直被使用,不能被垃圾回收
    • 方法区内存耗尽:加载的类越来越多,很多框架都会在运行期间动态产生新的类(代理类之类的)(较少见)
    • 虚拟机栈累积:每个线程最多会占用1M内存,线程个数越来越多,而又长时间运行不销毁时
  • 出现StackOverflowError的区域

    • 虚拟机栈内部–方法调用次数过多(递归)
  • 方法区与永久代、元空间之间的关系

    • 方法区是JVM规范中定义的一块内存区域,用来存储类元数据、方法字节码、即时编译器需要的信息等
    • 永久代是Hotspot虚拟机对JVM规范的实现(1.8之前)
    • 元空间是Hotspot虚拟机对JVM规范的实现(1.8以后),使用本地内存作为这些信息的存储空间

JVM内存参数

  • 对于JVM内存配置参数:-Xmx10240m -Xms10240m -Xmn5120m -XX:SurvvorRatiO=3具最小内存值和Survivor区总大小分别是?

    • -Xmx:虚拟机最大内存数
    • -Xms:虚拟机最小内存数
    • -Xmn:虚拟机中新生代的内存数
      在这里插入图片描述
  • 最小内存值是10240m,Survivor=2048m

JVM垃圾回收

  • JVM垃圾回收算法:

    • 标记清除——有碎片(基本不用,除CMS(在新版本的jdk中已被废弃了)
    • 标记整理——比标记清除多了一个整理的阶段,消除碎片,缺点:效率低(多用于
    • 标记复制——将有两块内存(有一块是空的),先标记GC root,然后复制到另一块内存中,没有碎片,效率较高,缺点:占用内存多(多用于新生代)
  • 说说GC和分代回收算法

  • GC的目的在于对无用的对象内存自动释放,减少内存碎片、加快分配速度

  • GC要点:

    • 回收区域是堆内存,不包括虚拟机栈,在方法调用结束会自动释放方法占用内存
    • 判断无用对象,使用可达性分析算法,三色标记法标记存活对象,回收未标记对象
    • GC具体的实现称为垃圾回收器
    • GC大都采用了分代回收思想,理论依据是大部分对象朝生夕灭,用完立刻就可以回收,另有少部分对象会长时间存活,每次很难回收,根据这两类对象的特性将回收区域分为新生代和老年代,不同区域应用不同的回收策略
    • 根据GC的规模可以分成 Minor GC,Mixed GC,Full Gc
  • 分代回收

    • 伊甸园eden,最初对象都分配到这里,与幸存区合称新生代
    • 幸存区survivor,当伊甸园内存不足,回收后的幸存对象到这里,分成 from和to,采用标记复制算法
    • 老年代 old,当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会导致提前晋升)
  • GC规模

    • Minor GC发生在新生代的垃圾回收,暂停时间短
    • Mixed GC新生代+老年代部分区域的垃圾回收,G1收集器特有
    • Full GC新生代+老年代完整垃圾回收,暂停时间长,应尽力避免

三色标记与并发漏标问题

  • 用三种颜色记录对象的标记状态
    • 黑色–已标记
    • 灰色–标记中
    • 白色–还未标记
  • 漏标问题-记录标记过程中变化
    • Incremental Update(增长更新)
      • 只要赋值发生,被赋值的对象就会被记录
    • Snapshot At The Beginning,SATB(原始对照)
      • 新加对象会被记录
      • 被删除引用关系的对象也被记录

垃圾回收器

  • Parallel Gc(并行)
    • eden内存不足发生Minor GC,标记复制 STW(程序暂停)
    • old内存不足发生Full GC,标记整理 STW
    • 注重吞吐量
  • ConcurrentMarkSweep(CMS) Gc(有内存碎片,基本废弃)
    • old并发标记,重新标记时需要STW,并发清除
    • Failback Full Gc
    • 注重响应时间
  • G1 GC(默认回收器)
    • 响应时间与吞吐量兼顾
    • 划分成多个区域,每个区域都可以充当eden,survivor, old, humongous(存放大对象)
    • 新生代回收: eden内存不足,标记复制STw
    • 并发标记: old并发标记,重新标记时需要STw
    • 混合收集:并发标记完成,开始混合收集,参与复制的有eden. survivor、old,其中old会根据暂停时间目标,选择部分回收价值高的区域,复制时STw
    • Failback Full GC(保底)

内存溢出

  • 项目中什么情况下会内存溢出,怎么解决的?
  • 误用线程池导致的内存溢出(自定义线程池)(栈溢出)
  • 查询数据量太大导致的内存溢出(分页)
  • 动态生成类导致的内存溢出(将静态变量的对象,改成局部变量的对象)(元空间溢出)

类加载

  • 类加载过程、双亲委派

  • 加载

    • 将类的字节码载入方法区,并创建类.class 对象
    • 如果此类的父类没有加载,先加载父类
    • 加载是懒惰执行
  • 链接

    • 验证–验证类是否符合Class规范,合法性、安全性检查
    • 准备–为static变量分配空间,设置默认值
    • 解析–将常量池的符号引用解析为直接引用
  • 初始化

    • 执行静态代码块与非final静态变量的赋值
    • 初始化是懒惰执行
  • 何为双亲委派

  • 所谓的双亲委派,就是指优先委派上级类加载器进行加载,如果上级类加载器

    • 能找到这个类,由上级加载,加载后该类也对下级加载器可见
    • 找不到这个类,则下级类加载器才有咨格执行加载
      在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVMJava虚拟机)内存模型和垃圾回收Java程序中重要的概念。JVM内存模型定义了Java程序在运行时所使用的内存结构,而垃圾回收是一种自动化的内存管理机制,用于回收不再使用的对象以释放内存空间。 JVM内存模型主要包括以下几个部分: 1. 堆(Heap):堆是JVM中最大的一块内存区域,用于存储对象实例。在堆中分配的内存垃圾回收器自动管理。 2. 方法区(Method Area):方法区用于存储类的信息、常量、静态变量等数据。在JDK 8及之前的版本中,方法区被实现为永久代(Permanent Generation),而在JDK 8之后,被改为元空间(Metaspace)。 3. 虚拟机栈(VM Stack):每个线程在运行时都会创建一个虚拟机栈,用于存储局部变量、方法调用和返回信息等。每个方法在执行时都会创建一个栈帧(Stack Frame),栈帧包含了方法的局部变量表、操作数栈、动态链接、返回地址等信息。 4. 本地方法栈(Native Method Stack):本地方法栈与虚拟机栈类似,但用于执行本地方法(Native Method)。 垃圾回收JVM的一项重要功能,它负责自动回收不再使用的内存JVM中的垃圾回收器会定期扫描堆中的对象,标记出不再被引用的对象,并将其回收释放。垃圾回收可以有效地避免内存泄漏和内存溢出的问题,提高程序的性能和稳定性。 JVM内存模型和垃圾回收Java程序员需要了解和理解的重要概念,它们直接影响到Java程序的性能和内存使用情况。合理地管理内存和优化垃圾回收对于编写高效、稳定的Java程序至关重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值