【面试体系知识点总结】---JVM

JVM:

1、java运行环境

JRE。JRE包括JVM。Java程序是运行在JVM上的。

2、java的跨平台性

.java文件被编译成.class文件在虚拟机上运行。java的运行环境是JRE,JRE中包括java虚拟机和java程序运行时所需的核心类库。不同的系统上面包含的是不同的类库(Linux中的JRE包含的是针对Linux的类库;Windows中的JRE包含的是针对Windows的类库)。

3、虚拟机的体系结构

堆、栈、方法区、程序计数器、本地接口和本地方法栈、执行引擎、类加载子系统。

(1)类加载子系统

分为–>启动类加载器、扩展类加载器、应用程序类加载器、用户自定义的类加载器。

(2)和类加载器相关的两个异常

①、加载时找不到文件:报ClassNotFoundException。
②、加载到的类中引用到的其他类不存在:报NoClassDefFoundError。

4、java中各种数据在虚拟机的存储位置
(1)堆:java程序在运行时所创建(new)的所有对象实例。------> 通过GC垃圾收集器回收。

new出来的对象存放于堆中

(2)栈:每个线程的数据;每个方法的调用状态。(局部变量、参数、返回值等)。

new出来对象的引用存在于栈中。局部变量、参数、返回值等。

(3)方法区:又称常量池。全限定类名;访问修饰符;字段信息、方法信息;除常量之外的所有类的静态变量。

全限定类名;访问修饰符;字段信息、方法信息;除常量之外的所有类的静态变量。

5、堆的结构:二叉树结构。

6、垃圾回收流程

(1)java虚拟机通过“根搜索算法”来判断对象处于可回收状态时;判断对象是否重写了finalize方法;如果没有,就直接回收。
(2)如果重写了finalize方法,未执行该方法;则把该对象放入F-Queue队列。另一个线程会定时遍历F-Queue队列,并执行该队列中的各个对象的finalize方法。
(3)finalize方法执行完毕后,GC会再次判断该对象是否可被回收。如果可以,则进行回收;如果该对象上有强引用,则该对象“复活”,处于“不可回收状态”。

7、如何判断对象可回收依据

  • 当某个对象上面没有强引用时,该对象就可以被回收。
  • 引用计数算法、根搜索算法。

(1)引用计数算法:
①、引用计数算法,是判断对象是否存活的基本算法。
②、给每一个对象添加一个引用计数器,每当一个地方引用它的时候,计数器+1;当引用失效时,计数器-1。
③、优缺点:
优点:简单。
缺点:无法回收循环引用的对象。例如:a引用指向b,b指向c,c再指向a。在这种情况下,哪怕他们游离在主程序之外(程序不再用到他们),a,b,c三个引用的计数值都是1,这样他们始终无法被回收。

(2)根搜索算法:
①、从一个根节点(GC ROOT)开始,寻找他所对应的引用节点,找到这个节点后,继续寻找该节点的引用节点,以此类推。当所有引用节点都搜索完毕之后,剩下的就是没有被引用的节点,也就是可回收节点。
②、可作为GC Root的对象:
A、虚拟机栈中引用的对象。
B、方法区中静态属性引用的对象。
C、方法区中常量引用的对象。
D、本地方法栈中引用的对象。

8、finalize方法的作用、是否重写过

  • 作用:当对象不再被任何对象引用时,GC会调用该对象的finalize()方法。(做内存清理工作)
  • 工作原理:

垃圾回收器准备释放对象占用的内存空间,将首先调用finalize方法,下一次垃圾回收动作发生,会真正的回收该对象占用的内存。(即finalize方法会在垃圾回收器真正回收对象之前调用)。

9、JVM在垃圾回收时,会设计哪些算法JVM垃圾回收所涉及算法(垃圾回收算法)

  • 标记—清除算法:

(1)最基础的垃圾回收算法。
(2)优缺点:
优点:容易实现,思想简单。
缺点:标记和清除的效率不高;标记清楚后会产生大量的内存碎片。
(3)分为两个阶段:标记阶段和清除阶段。
①、标记阶段:标记出所有需要回收的对象。
②、清除阶段:统一回收所有被标记的对象。
③、标记使用“根搜索算法”。

  • 复制算法:

(1)优缺点:
①、优点:实现简单,运行高效,不容易产生碎片。
②、缺点:内存空间的使用缩小到原来的一半。
复制算法的效率和存活对象数目的多少有很大关系。存活对象很多,复制算法的效率就会降低。
(2)作用:为了解决标记—清除算法的缺点。
(3)使用:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。

  • 标记—整理算法:

(1)作用:为了解决复制算法的缺点,充分利用内存空间。
(2)使用:标记出所有需要回收的对象;将多有存活的对象都移向内存的一端,然后清理掉端外界的对象。

  • 分代收集算法:

(1)思想:JVM中不同的对象拥有不同的生命周期,对于不同生命周期的对象采用不同的垃圾回收方法。
(2)好处:提高效率。
(3)将GC堆划分为老生代和新生代。
①、老生代:每次垃圾回收时,只有少量对象需要被回收。
采用Mark-Compact(标记整理)算法。
②、新生代:每次垃圾回收时,都有大量垃圾需要被回收。
采用Copying(复制)算法。

10、final、finally、finalize三者的区别

  • final:修饰符(关键字)。

(1)如果一个类被声明为final,该类不能派生新的子类,也不能作为父类被继承。
(2)将变量或方法声明为final,可以保证他们在使用中不被改变。
被声明为final的方法不能被重载;
被声明为final的变量不能被修改。

  • finally:

(1)与try…catch一起使用;
(2)总是被执行:如:流的关闭。

  • finalize:方法名。

(1)finalize()是Object类中的protected类型的方法。
(2)子类可以通过覆盖这个方法来实现回收前的资源清理工作。

11、造成的内存异常
(1)内存溢出错误(OutOfMemoryError,OOM):

①、
A、错误描述:java.lang.OutOfMemoryError:unable to create new native thread。
B、 错误原因:通过new Thread方法无法创建线程时,或抛出此错误。(创建不了的原因通常是线程太多耗尽了内存)。
C、解决办法:
可在代码中减少线程数。
可通过-Xss调小线程所占用的栈的大小,从而降低对内存的消耗。

②、
A、错误描述: java.lang.OutOfMemoryError:Java.heap.space。
B、 错误原因:通过new创建对象时,堆空间不足,触发轻量级GC和Full GC依然不够,则会抛出此错误。
C、解决办法:检查程序,查看哪些对象没有被及时回收。

③、
A、错误描述: java.lang.OutOfMemoryError:GC overhead limit execeeded。
B、 错误原因:通过new创建对象时,堆空间不足,垃圾回收所使用的的时间占用了程序总时间的98%,且堆剩余空间小于2%,则会抛出此错误。
C、解决办法:查看哪些对象可以被及时回收。

12、内存溢出和内存泄露的区别

(1)内存溢出:(OutOfMemoryError)
是指程序在申请内存时,没有足够的内存空间供其使用。

(2)内存泄漏:(Memory Leak)
①、长期的内存泄漏会造成内存溢出。
②、是指程序在申请内存后,无法释放已申请的内存空间。

13、什么情况下该排查内存问题
(项目上线后,一旦出现以下情况,就说明可能出现了内存方面的问题,需要通过查看日志等方法进行排查)。

(1)从日志中经常看到OOM或StackOverFlowError异常。
(2)日志的运行时间经常大大超过预期。
(3)查看日志时,程序会无故卡在某个地方,而且每次卡的位置都不同。
(4)程序运行时,内存使用量和CPU占用率居高不下,超过预期。

14、java程序在虚拟机的执行流程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值