首页 > 编程知识 正文

阿里笔试题2021,初级前端面试题2020及答案

时间:2023-05-04 02:43:02 阅读:32358 作者:3929

本文主要介绍了2020年90%的面试蚂蚁字节跳动对被问到的JVM面试问题的回答。 我觉得编辑在网上看起来很好。 现在请大家分享,作为参考。 请和编辑一起来看看!

前言: 3358 www.Sina.com/http://www.Sina.com /

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

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

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

二、JVM内存型号详情?

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

程序计数器:线程是专用的,是用作当前线程行号指示器的小内存区域,用于记录当前虚拟机正在运行的线程的指令地址。堆栈:线程专用,每次执行方法时都是行如果线程请求的堆栈深度超过虚拟机允许的最大深度,则会抛出堆栈溢出错误。 本地方法堆栈:线程是专用的,它存储朴素方法的信息。 当jvm创建的线程调用native方法时,jvm不会在虚拟机堆栈中为该线程创建堆栈帧,而是创建简单的动态链接并直接调用该方法。 堆: java堆是所有线程共享的一个内存,几乎所有对象的实例和数组都为堆分配内存,因此此区域经常发生垃圾回收。 方法区域:存储加载的类信息、常量、静态变量和即时编译器编译的代码数据。 即,永久地,jdk1.8中不存在方法区域,被元数据区域代替,原始方法区域被分为两部分; 1 )加载的类信息;2 )运行时常量池; 加载的类信息存储在元数据区域中,运行时常量池存储在堆中。 三. JVM中的完整GC是什么样的? 对象如何晋升到老年代?

java堆=美丽的金毛代老年代; 美丽的金毛费=时尚猎豹suivivor(S0S1)的默认分配比例为8:1:1; 当时尚猎豹区空间满满的时候,Minor GC会触发它收集漂亮的黄金毛一代垃圾。 存活对象直接分配给Survivor区域中的大对象(需要大量连续内存空间的对象)。 如果在旧时代出生于时尚猎豹,经历过一次Minor GC后仍被分配到生存区,那么年龄1、之后每次都满了旧的年龄,容纳不下更多的对象,就会触发一次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来表示,在垃圾回收时,一旦发现一个对象只具有软引用的时候,无论当前内存空间是否充足,都会回收掉该对象;弱引用可以和引用队列联合使用,如果弱引用所引用的对象被垃圾回收了,虚拟机会将该对象的引用加入到与之关联的引用队列中;

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

到此这篇关于2020面试阿里字节跳动90%被问到的JVM面试题附答案的文章就介绍到这了,更多相关JVM面试题内容请搜索我以前的文章或继续浏览下面的相关文章!

另外本人整理收藏了20年多家公司面试知识点整理 共127页的PDF 以及各种知识点整理 免费分享给大家,想要资料的话点击795983544 暗号CSDN,或者私信我,暗号PDF。 深入底层,剖析源码。了解本质。 爱编程,爱生活,爱分享!文章的最后祝大家在工作的工作顺利,在找工作的都能拿到自己满意的offer!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。