首页 > 编程语言 >25届实习秋招-Java面试-JVM虚拟机面试题整理-牛客网

25届实习秋招-Java面试-JVM虚拟机面试题整理-牛客网

时间:2023-09-15 10:02:26浏览次数:48  
标签:25 面试题 对象 虚拟机 回收 GC 内存 JVM 垃圾

JVM

JVM概述:

  • 是什么-规范,有什么作用(多态,越界)
    • Java为什么可以跨平台移植
    • Java怎么做编译?与C语言的编译有什么区别?
  • 比较: jvm jre jdk
  • 整体的架构:

内存结构

  • 内存结构/内存模型--即为运行时数据区:

    • JVM了解过哪些版本,1.8和1.7内存结构不同的地方
      • 堆中方法区(永久代实现)改为了放在本地内存的 方法区(元空间),堆中剩下年轻和老年代
    • 内存结构是怎样的
    • 哪些区域会出现OOM?
  • JVM内存

    • 虚拟机栈:

      • 虚拟机栈和本地方法栈的区别?

      • 栈和栈帧的作用,属于什么

      • 栈里有什么,栈帧的结构

      • 是否要垃圾回收

      • OOM和StackOverflow是什么区别? OOM的可能

      • 两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常。
             栈空间不足:java.lang.StackOverFlowError。
             堆空间不足:java.lang.OutOfMemoryError。
        
    • 本地方法栈存储的什么

      • 有OOM
    • 程序计数器:

      • 特定,会OOM码
    • 堆:

      • 特点:
      • 堆中有哪些对象:生成的Class对象存储在哪里。
      • JAVA7中,堆内存的分区
      • Java8中,方法区改为本地内存的元空间,避免OOM错误
    • 方法区:

      • 是什么,存了什么
        • 字节码存储在哪个区域
      • 常量池,运行时常量池,字符串常量池
        • 常量池== 常量池表,查表。
        • 字符串常量池:
          • jdk 1.6之前StringTable是存在永久代中,属于运行时常量池一部分.
            但是由于使用很频繁,且永久代中垃圾回收效率很低,所以为了优化.
            jdk 1.7之后将StringTable移除到了堆内存中,堆内存中垃圾回收效率更高!
    • 本地内存:

      • 和虚拟机内存的区别:
      • 直接内存:
    • 变量的位置:

      • private static final String 修饰的字符串对象在哪个区域
        • 堆中,字符串常量池/static

内存管理:

  • 内存的分配:

    • TLAB简单了解一下
    • 逃逸分析:
      • 对象只能在堆上分配吗?如果在栈上分配,除了逃逸分析外,还要有什么条件?
    • 分代思想:
      • 新生代和老年代,比例划分
        • 新生代又分为什么:
      • MinorGC和Full GC
      • 分代是如何分配的
        • YoungGC是什么
      • 晋升到老年代:
        • 阈值,大对象
        • 大对象为什么不放在新生代
        • 新生代对象转移到老年代的条件,对象晋升是什么, 过早晋升会导致哪些危害
  • 回收策略:

    • 各种GC什么时候触发:

      • minorgc的触发时机是什么,触发STW

      • 什么时候会FUll GC

      • 如何手动GC

      • 如何避免FUll GC

      • MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW)
        Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1 收集器特有
        FullGC: 新生代 + 老年代完整垃圾回收,暂停时间长(STW),应尽力避免
        
    • 这两个GC的流程:

    • GC的过程是由谁来调度的?GC线程是谁启动的?

  • 垃圾判断:

    • 什么是垃圾:
    • 要堆哪些进行垃圾回收
    • 判断对象存活一般有两种方式:引用计数算法可达性分析算法
      • 引用计数法:
        • 优点:循环引用问题
      • 可达性算法:
        • 什么是GC roots
        • 如何选择gcroots(本地方法对象、静态对象,常量对象,被锁住的对象--说全了) 类加载器可以作为GC root吗
        • 应该有哪些前置性的操作
        • 可达性算法底层数据结构
        • 三色标记原理
          • 为什么会有垃圾碎片的产生:
          • 漏标的处理,了解。
      • 引用分析:
        • java的四大引用类型
  • 回收算法:

    • 三种区别,优缺点,用在哪里:具体的回收要依赖回收算法
    • JVM综合使用了上述算法,实现了分代垃圾回收机制
  • 垃圾回收器:

    • JDK各个版本使用的哪个垃圾回收器
    • 是回收算法的具体实现:分为哪几类:
      • CMS的工作流程,使用场景,CMS简单说下哪些环节会有STW
        • 清除,
      • G1的工作流程,和CMS区别,优缺点
        • g1有分区嘛,g1里除了新老生代,还新增了哪个区
        • 浮动垃圾有解决吗?浮动垃圾的后果。
        • CMS和G1如何选择。
        • G1中新生代和老年代的比例是动态的吗 ,比例是多少。你有去看过内存空间的设置吗。避免手动调节,自动分配。
    • 怎么检测垃圾回收的状态呢?
  • 内存泄漏

    • jvm内存溢出和内存泄露的区别,分别有哪些场景?
      • 虚拟机栈会内存溢出吗?堆会内存溢出吗?
    • 几种情况:举例
      • 如何避免内存泄漏,避免这几种情况?(在finally块释放资源)

类加载:

  • 对象访存:

    • 实际大小:shallow heap和retained heap区别
  • 什么是类加载:

    • 类加载机制和过程:

      • 连接的作用
    • 类加载过程中,cinit方法如果执行失败了怎么办,这个类还能用吗?cinit方法能多次执行吗

    • 类在初始化过程中,它的静态变量,静态方法块,成员变量,构造函数的执行步骤是什么

  • 类加载器:

    • 有哪些类加载器:作用
    • 加载模型:
      • 为什么要有双亲委派,那我先加载自己的类不行吗?
      • 如何破坏双亲委派,自己写的重名类和内部类加载为啥报错
      • 双亲委派模型可能比较耗时,如果我就想自己加载怎么办,其实就是想问如何打破双亲委派模型? 以通过自定义类加载器加载java.lang包下的类吗?
      • 什么情况下需要自定义类加载器?怎样定义(完全不会)

运行机制:

  • 字节码:
    • 跨平台性
    • class文件对应什么,类文件的结构:

系统优化:

  • 性能调优:

  • JVM调优会不会:背景+思路+具体改动+验证方案,聊一次排查 JVM 的经历

  • 了解过一些相关监测指令吗?

  • 参数调优:在哪设置

    • 常用的JVM参数:
      • 最大堆和最小堆设置一样大,-Xms-Xmx
        • 如果我设置了Xmx为1G,但是实际看Java进程用了1.3G,你觉得多出来的0.3G可能来自哪些部分。堆外内存,栈。
        • Java申请的1g内存全部是真实的内存吗?
          • 虚拟内存,堆和非堆
      • 设置哪些分配内存参数
  • 实际案例:

    • 老年代一直满?然后让我分析可能是哪些原因。

      • 当老年代(Old Generation)占用很满时,可能有以下几种原因:

        内存泄漏(Memory Leaks):这是最常见的原因之一。如果应用程序中存在内存泄漏,就会导致对象无法被垃圾回收,最终导致老年代占用过多的内存空间。内存泄漏通常是由于对象被错误地引用或持有,导致它们无法被及时释放。
        长时间存活的对象(Long-lived Objects):老年代主要用于存储长时间存活的对象。如果应用程序中存在大量长时间存活的对象,老年代的空间可能会很快被占满。
        过大的对象(Large Objects):如果应用程序中创建了过大的对象,这些对象可能无法在新生代(Young Generation)中完全分配,而直接分配到老年代中。如果这些大对象过多,老年代的空间就会被快速占满。
        GC调优不当:垃圾回收(Garbage Collection)算法和参数的选择对老年代的使用有很大影响。如果垃圾回收器的配置不合理或参数设置不当,可能导致老年代无法及时释放对象,从而造成占用过多的内存空间。
        
    • 频繁发生minor GC

      • 时间比较久的Minor GC
    • Full GC次数过多。

    • YGC导致CPU负载过高的排查与解决

    • 怎么排查,JVM工具

    • 有没有遇到OOM的问题,内存区域哪些地方会OOM,如何解决OOM的

    • MetaSpace占用内存高一般是什么原因导致的?怎么排查?MetaSpace占用没有很多,但是发生Full GC是因为什么?

    • Java对象创建的流程步骤

      • new初始化过程,和反射相比谁更快?
    • 了解过热点代码吗? 你知道hotsport为什么要叫hotspot?

    • JVM内存模型,如果一个项目中频繁大量创建寿命短的对象,如何优化JVM。

说说 JMM

标签:25,面试题,对象,虚拟机,回收,GC,内存,JVM,垃圾
From: https://www.cnblogs.com/Blunt-Raz0r/p/17704181.html

相关文章

  • 25届实习秋招-Java面试-JUC多线程面试题整理-牛客网
    JUC介绍一下JUC下的锁(如何使用及应用场景)线程什么是进程:特征什么是线程:资源为什么多线程,什么使用用单线程,什么时候多线程,什么条件下多线程快。进程和线程的对比:进程如何通信,每种通信存放的介质。||线程的通信,几种方式。join进程和线程的区别,在JVM层面的体现一......
  • 25届实习/秋招-java面试-JavaSe面试题整理-牛客网
    JavaSe变量和运算符:基本数据类型介绍java中浮点数精度怎么解决,有了解过实现吗,为什么有精度问题BigDecimal,如何判断BigDecimal是否相等。如何进行计算、怎么四舍五入基本类型几种,分别占用空间int和Integer区别--包装类,int有几个字节。包装类常量池怎么判断相等的......
  • 【面试题精讲】你了解String.intern方法吗
    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址系列文章地址String.intern方法是Java中的一个方法,它用于将字符串对象添加到字符串常量池中,并返回常量池中该字符串的引用。如果常量池中已经存在该字符串,则......
  • P251——用RadialGradientBrush填充椭圆,并进行RotateTransform变换
    一、认识RadialGradientBrush(径向渐变)    1.坐标      RadialGradientBrush可以用来填充矩形(正方形)和椭圆(正圆),      填充区域使用比例坐标,      椭圆的坐标(0,0)和(1,1)构成的矩形内切于椭圆2.设置径向渐变颜色GradientStop<Gradi......
  • TQT113平台虚拟机镜像使用手册
    ▲点击上方“广州天嵌”关注公众号后回复TQT113_CORE获取板卡wiki资料本文介绍如何使用我司提供的虚拟机镜像,搭建虚拟机环境,构建编译TQT113_COREB开发板的开发环境。注意事项:若用户没有搭建过调试和开发环境,或已有我司其他开发平台或其他厂商的测试开发环境的,请先严格按照本手册搭......
  • TQT113平台虚拟机镜像使用手册
    本文介绍如何使用我司提供的虚拟机镜像,搭建虚拟机环境,构建编译TQT113_COREB开发板的开发环境。注意事项:若用户没有搭建过调试和开发环境,或已有我司其他开发平台或其他厂商的测试开发环境的,请先严格按照本手册搭建成功后再进行测试调试开发等内容操作,避免因为环境不一致导致测试和......
  • 独家珍藏的Android面试突击宝典,轻松应对95%秋招面试题
    前言最近发现了很多同学出现的一个问题,简历已读不回,没有面试机会等等问题,觉得互联网不行了,Android不行了,甚至有人说自己这辈子最后悔的事情就是进入it这个行业。我每次看到这样的反馈或者这样的说法的时候,心里总不是滋味,我承认大家现在反馈的问题在一定程度上确实是客观存在的情况,......
  • 拼多多面试题解析:Java实现继承的七种方式!
    大家好,我是小米!今天,我要和大家一起来深入探讨一下拼多多的面试题:Java实现继承有哪7种方式?这是一个相当有深度的问题,不过别担心,我会尽力以通俗易懂的方式给大家讲解清楚,让大家对Java继承有更深刻的理解。什么是继承在Java编程中,继承是一种非常重要的概念,它允许一个类(子类/派......
  • 剑指Offer面试题3题目二:不修改数组找出重复的数字
    一、题目在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或3。输入参数:一个整数数组numbers,......
  • Cisco Nexus 9000v 虚拟机换机系统软件 NX-OS Release 10.4(1)F 发布 - 学习 Nexus 和
    CiscoNexus9000vSwitch,NX-OSRelease10.4(1)F请访问原文链接:https://sysin.org/blog/cisco-nexus-9000v/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgNX-OSSystemSoftwareReleaseDateCiscoNX-OSRelease10.4(1)F2023-08-18CiscoNX-OSRel......