当前位置:网站首页>【面试体系知识点总结】---JVM

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

2022-08-09 09:17:00 我是不贪嘴吖

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程序在虚拟机的执行流程

原网站

版权声明
本文为[我是不贪嘴吖]所创,转载请带上原文链接,感谢
https://blog.csdn.net/xiaoxiaoxiang1/article/details/105971613