热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

阿里笔试题2021,redis面试题2021

最近老是收到小伙伴的私信问我能不能帮忙整理出一份JVM相关的面试题出来,说自己在大厂去面试的时候这一块问的是特别多的,每次自己学的时候每次都学不到重点去。这不他来了,一份详细的JV


最近收到了伙伴的私人信件,问能不能整理一下JVM相关的问题。 自己去大工厂面试的时候,这部分太多了,说自己每次学习都不能把重点放在上面。 不,他来了。 详细的JVM面试真题整理如下。


一、在什么情况下会发生堆栈内存溢出? 1、堆栈是线程的私有。 堆栈的生命周期与线程相同,每个方法在运行时创建堆栈帧。 它包括局部变量表、操作数堆栈、动态链接和方法出口等信息,局部变量表还包括对基本数据类型和对象的引用。


2 .如果线程请求的堆栈深度超过虚拟机允许的最大深度,则会抛出堆栈溢出错误异常,方法递归调用序列可能会出现此问题;


3、调整参数-xss调整jvm堆栈大小


二、JVM内存型号详情?


jvm将虚拟机分为五个区域:程序计数器、虚拟机堆栈、本地方法堆栈、java堆和方法区域;


程序计数器:线程是专用的,是一个小内存空间,用作当前线程的行号指示器,以记录当前虚拟机正在运行的线程的指令地址


堆栈:线程是专用的,每次执行方法时,都会创建一个堆栈框架,其中包含本地变量表、操作数、动态链接和方法返回等信息。 如果线程请求的堆栈深度超过虚拟机允许的最大深度,则会抛出堆栈溢出错误。


本地方法堆栈:线程是专用的,它存储朴素方法的信息。 当jvm创建的线程调用native方法时,jvm不会在虚拟机堆栈中为该线程创建堆栈帧,而是创建简单的动态链接并直接调用该方法。


堆: java堆是所有线程共享的一个内存,几乎所有对象的实例和数组都为堆分配内存,因此此区域经常发生垃圾回收。


方法区域:存储加载的类信息、常量、静态变量和即时编译器编译的代码数据。 即,永久地,jdk1.8中不存在方法区域,被元数据区域代替,原始方法区域被分为两部分; 1 )加载的类信息;2 )运行时常量池; 加载的类信息存储在元数据区域中,运行时常量池存储在堆中。


三. JVM中的完整GC是什么样的? 对象如何晋升到老年代?


java堆=聪明蘑菇世代伶俐蘑菇费=FKDshsuivivor(S0S1),默认分配比例为8:1:1; 当fkdsh区域的空间充满时,Minor GC将启动,收集聪明的金针菇一代垃圾。 存活对象直接分配给Survivor区域中的大对象(需要大量连续内存空间的对象)。 如果对象在fkdsh中出生,经历过一次Minor GC后仍被分配到生存区域,则年龄1、年龄2。如果旧的年龄已满,无法容纳更多的对象,则触发一次full gc; full gc存储了包括年轻一代和老一代在内的整个内存堆栈。 Major GC是一种发生在较早年代的GC,清理老年人区经常至少伴有一次minor gc


四. Java的垃圾回收算法? JVA有4种垃圾回收算法,分别是标签去除法、标签整理法、复制算法、分代收集算法;


标记法:第一步:利用可达性遍历内存,标记生存对象和垃圾对象; 步骤2 :要回收所有标记的对象,请重复遍历。 特点:效率低,标志和通关效率不高; 标记和清除后会生成大量不连续的空间分片,然后在程序运行时需要分配大对象,可能找不到连续分片,必须启动GC一次。


标记组织方法(第一步)利用可达性遍历内存,标记生存对象和垃圾对象; 步骤2 )将所有存活对象移动一级,回收除边缘边界以外的所有对象; 特点:适用于生存对象多、垃圾少的情况; 需要整理过程,不产生空间碎片;


复制算法:根据容量大小将内存分为两个大小相同的块,一次仅使用一个,使用完一个后,将仍然存在的对象移动到另一个块,删除已使用的内存空间; 特点:内存利用率极低,不会出现空间碎片


分代收集算法:根据内存对象的生存周期,将内存分成几个块。 java虚拟机一般将内存分为聪明的棘球蚴代和老生代,聪明的棘球蚴代中,大量对象死亡,少量对象生存,因此采用复制算法,只需少量生存对象的复制代价即可完成收集; 在上一代,由于对象生存率极高,没有给他进行分配保证的额外空间,所以采用标签清理或标签整理算法进行回收;


五、如何判断一个对象是否生存? 要判断一个对象是否存在,可以分为两种算法1。 引用计数法; 2 )可达性分析算法


引用计数方法:在每个对象上设置引用计数器,如果某个位置引用该对象,则引用计数器为1;如果引用被禁用,则引用计数器为-1;如果引用计数器为0,则该对象未被引用,即当a引用b,b也引用a时,由于此时AB对象的所有引用都不是0,并且此时也不能进行垃圾收集,所以典型的主流虚拟机不采用该方法。


可达性分析法从称为GC Roots的对象开始向下搜索。 如果某个对象到GC Roots的引用链未连接,则表示该对象不可用。 可以在java中用作GC Roots的对象如下:


虚拟机堆栈中引用的对象方法区域类的静态属性引用的变量方法区域常量池引用的对象本地方法堆栈JNI引用的一个对象

对象满足上述条件的时候,不会马上被回收,还需要进行两次标记;第一次标记:判断当前对象是否有finalize()方法并且该方法没有被执行过,若不存在则标记为垃圾对象,等待回收;若有的话,则进行第二次标记;第二次标记将当前对象放入F-Queue队列,并生成一个finalize线程去执行该方法,虚拟机不保证该方法一定会被执行,这是因为如果线程执行缓慢或进入了死锁,会导致回收系统的崩溃;如果执行了finalize方法之后仍然没有与GC Roots有直接或者间接的引用,则该对象会被回收;

六、有哪几种垃圾回收器,有哪些优缺点?cms和g1的区别?

垃圾回收器主要分为以下几种:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;

Serial:单线程的收集器,收集垃圾时,必须stop the world,使用复制算法。

ParNew:Serial收集器的多线程版本,也需要stop the world,复制算法.

ParallelScavenge:伶俐的金针菇代收集器,复制算法的收集器,并发的多线程收集器,目标是达到一个可控的吞吐量,和ParNew的最大区别是GC自动调节策略;虚拟机会根据系统的运行状态收集性能监控信息,动态设置这些参数,以提供最优停顿时间和最高的吞吐量;

Serial Old:Serial收集器的老年代版本,单线程收集器,使用标记整理算法。

Parallel Old:是Parallel Scavenge收集器的老年代版本,使用多线程,标记-整理算法。

CMS:是一种以获得最短回收停顿时间为目标的收集器,标记清除算法,运作过程:初始标记,并发标记,重新标记,并发清除,收集结束会产生大量空间碎片;

G1:标记整理算法实现,运作流程主要包括以下:初始标记,并发标记,最终标记,筛选回收。不会产生空间碎片,可以精确地控制停顿;G1将整个堆分为大小相等的多个Region(区域),G1跟踪每个区域的垃圾大小,在后台维护一个优先级列表,每次根据允许的收集时间,优先回收价值最大的区域,已达到在有限时间内获取尽可能高的回收效率;

七、什么是类加载?

虚拟机把描述类的数据加载到内存里面,并对数据进行校验、解析和初始化,最终变成可以被虚拟机直接使用的class对象;

八、类加载的过程?

主要分为以下几个过程:加载、验证、准备、解析、初始化;加载:加载分为三步:

1、通过类的全限定性类名获取该类的二进制流;

2、将该二进制流的静态存储结构转为方法区的运行时数据结构;

3、在堆中为该类生成一个class对象;

验证:验证该class文件中的字节流信息复合虚拟机的要求,不会威胁到jvm的安全;

准备:为class对象的静态变量分配内存,初始化其初始值;

解析:该阶段主要完成符号引用转化成直接引用;

初始化:到了初始化阶段,才开始执行类中定义的java代码;初始化阶段是调用类构造器的过程;

九、什么是类加载器,常见的类加载器有哪些?

类加载器是指:通过一个类的全限定性类名获取该类的二进制字节流叫做类加载器;类加载器分为以下四种:启动类加载器:用来加载java核心类库,无法被java程序直接引用;

扩展类加载器:用来加载java的扩展库,java的虚拟机实现会提供一个扩展库目录,该类加载器在扩展库目录里面查找并加载java类;

系统类加载器:它根据java的类路径来加载类,一般来说,java应用的类都是通过它来加载的;

自定义类加载器:由java语言实现,继承自ClassLoader;

十、什么是双亲委派模型?

当一个类加载器收到一个类加载的请求,他首先不会尝试自己去加载,而是将这个请求委派给父类加载器去加载,只有父类加载器在自己的搜索范围类查找不到给类时,子加载器才会尝试自己去加载该类;

十一、为什么需要双亲委派模型?

为了防止内存中出现多个相同的字节码;因为如果没有双亲委派的话,用户就可以自己定义一个java.lang.String类,那么就无法保证类的唯一性;

十二、怎么打破双亲委派模型?

自定义类加载器,继承ClassLoader类,重写loadClass方法和findClass方法;

十三、强引用、软应用、弱引用、虚引用的区别?

强引用:强引用是我们使用最广泛的引用,如果一个对象具有强引用,那么垃圾回收期绝对不会回收它,当内存空间不足时,垃圾回收器宁愿抛出OutOfMemoryError,也不会回收具有强引用的对象;我们可以通过显示的将强引用对象置为null,让gc认为该对象不存在引用,从而来回收它;

软引用:软应用是用来描述一些有用但不是必须的对象,在java中用SoftReference来表示,当一个对象只有软应用时,只有当内存不足时,才会回收它;软引用可以和引用队列联合使用,如果软引用所引用的对象被垃圾回收器所回收了,虚拟机会把这个软引用加入到与之对应的引用队列中;

弱引用:弱引用是用来描述一些可有可无的对象,在java中用WeakReference来表示,在垃圾回收时,一旦发现一个对象只具有软引用的时候,无论当前内存空间是否充足,都会回收掉该对象;弱引用可以和引用队列联合使用,如果弱引用所引用的对象被垃圾回收了,虚拟机会将该对象的引用加入到与之关联的引用队列中;

虚引用:虚引用就是一种可有可无的引用,无法用来表示对象的生命周期,任何时候都可能被回收,虚引用主要使用来跟踪对象被垃圾回收的活动,虚引用和软引用与弱引用的区别在于:虚引用必须和引用队列联合使用;在进行垃圾回收的时候,如果发现一个对象只有虚引用,那么就会将这个对象的引用加入到与之关联的引用队列中,程序可以通过发现一个引用队列中是否已经加入了虚引用,来了解被引用的对象是否需要被进行垃圾回收。

篇幅有限,我给大家准备了这份超详细JVM内存结构,读完之后相信碰到多数JVM面试都不怕,先展示部分截图:

 一、线程

二、JVM内存区域

程序计数器(线程私有)虚拟机栈(线程私有)本地方法区(线程私有)堆(Heap-线程共享)-运行时数据区方法区/永久代(线程共享)

三、JVM运行时内存

伶俐的金针菇代老年代永久代

四、垃圾回收与算法

如何确定垃圾标记清除算法(mhdjz-Sweep)复制算法(copying)标记整理算法(mhdjz-Compact)分代收集算法

五、java四种引用类型

强引用软引用弱引用虚引用

六、GC分代收集算法VS分区收集算法

分代收集算法分区收集算法

七、GC垃圾收集器

Serial垃圾收集器(单线程、复制算法)ParNew垃圾收集器(Serial+多线程)Parallel Scavenge收集器(多线程复制算法、高效)Serial Old收集器(单线程标记整理算法)Serial Old收集器(多线程标记整理算法)CMS收集器(多线程标记整理算法)G1收集器

八、JAVA IO/NIO

阻塞IO模型非阻塞IO模型多路复用IO模型信号驱动IO模型异步IO模型JAVA IO包JAVA NIOChannelBufferSelector

九、JVM类加载机制

加载验证准备解析符号引用直接引用初始化类构造器类加载项双亲委派OSGI(动态模型系统)

除此之外还有全套JAVA进阶资料,大量应对各个公司的面试经验技巧!

有需要可以的点击下方名片免费领取!


推荐阅读
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注【程序新视界】。本篇为面试题系列第2篇。常见面试问 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 腾讯T3大牛亲自教你!2021大厂Android面试经验,经典好文
    本篇将由环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来等七个方面,对当前的ReactNative和Flutter进行全面的分析对比, ... [详细]
  • jvm内存区域与溢出为什么学习jvm木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握。当一个系统出现内存溢出,内存泄露的时候 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
author-avatar
Le-麦兜_738
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有