Java史上最最基础面试题系列(8、Java平台于内存管理)——看到,你离工作就比别人近了一半!!!

注:资料有书为证,大伙可放心翻阅并熟记,由本人亲自总结!

1、为什么说Java时平台独立性的?

保证Java具有平台独立性的机制为“中间码”和“Java虚拟机”。

Java程序被编译后不是生成能在硬件平台上可执行的代码,而是生成了一个“中间码”。不同的平台装有不同的JVM,由JVM来负责把中间码翻译成硬件平台能执行的代码。

解释执行过程分为三步进行:代码的装入、代码的校验和代码的运行。装入由“类加载器”完成,被装入的代码由字节码校验器进行检查。

字节码的执行分为两种,一种为编译方式,一种为解释方式,前者整体翻译。效率高,后者一段一段的翻译。效率低下。

2、Java平台于其他语言平台有哪些区别?

Java平台时一个纯软件的平台,这个平台可以运行在一些基于硬件的平台上,例如Windows。

Java平台主要包括两个模块:JVM和JavaAPI。

JVM是一个虚构出来的计算机,用来把Java编译生成的中间代码转换为及其可以识别的编码并运行。

JavaAPI时Java为了方便开发人员进行开发而设计的,它提供了许多非常有用的接口,这些接口也是用Java语言编写的,运行在JVM上。

3、JVM加载class文件的原理机制是什么?

JVM会将编译好的.class文件按照需求和一定的规则加载到内存当中,从而组织出一个完成的应用程序来,这个过程一般由类加载器来完成(ClassLoader和它的子类)。类加载器本身也是一个类,其实质就是把类文件从硬盘上加载到内存上来。

类加载的方式可以分为隐式加载显式加载两种。隐式加载指的是程序在使用new等方式创建对象时,会隐式地调用类加载器来把相应的类加载到JVM中。显式加载指的是程序通过class.forName()方式来把所需要的类加载到JVM中。

在Java中,类的加载时动态的,它不会一次性将全部的类全部加载后再运行,而是首先加载一些基础类,其他的等到需要使用的时候再加载,这样可以保证加快加载速度,同时也能节省开销。

一般类可以分为三种,分别为系统类、扩展类和自定义类。

针对这三种类分别有三种类加载器,第一种BootstrapLoader——负责加载系统类(jre/lib/rt.jar的类)

​ 第二种ExtClassLoader——负责加载扩展类(jar/lib/ext/*.jar的类)

​ 第三种AppClassLoader——负责加载应用类(claspath指定的目录或jar 中的类)

这三种类加载器会通过一种叫双亲委派的方式来进行协调工作。具体的说,就是当有类需要被加载时,类加载器会首先查看自己有没有加载过这样的类,如果没有则请求它的父类来完成这个载入工作,看看父类之前是不是已经加载过这样的类,如果没有,再继续往上请求,直到Bootstrap这个顶级类加载器。如果到这里还是没有被加载,这个时候它就会自己加载,如果它没有加载的路径,则会继续向下委派,直到重新回到开始的类加载器,如果连它也没有加载路径,那么系统就会抛出类找不到的异常。

拓展1:由于BoostrapLoader使用c++写的,所以,再Java中式看不到的。

拓展2:类加载的主要步骤分为三步:装载(根据查找路径找到对应的class文件,然后导入)——>链接——>初始化(对静态变量和静态代码块执行初始化工作);其中链接有可以划分为三小步:检查(检查待加载的class文件的正确性)——>准备(给类中的静态变量分配存储空间)——>解析(将符号引用转换成直接引用)

4、什么式GC?(重点!!!)

简而言之,四个字垃圾回收,用来回收程序中不再使用的内存。

垃圾回收器要负责三项任务:分配内存、确保被引用对象的内存不被错误地回收以及回收不再被引用的对象的内存空间。

垃圾回收好处多多,只有你想不到的答案,没有它做不到的答案(手动滑稽!!!)

常用的垃圾回收算法:标记清除算法,标记整理算法,标记清除压缩算法,复制回收算法,引用计数算法、按代回收算法。(具体看资料!)

拓展:开发人员不能实时地调用垃圾回收器对某个对象或所有对象进行垃圾回收,但是却可以通过调用System.gc()方法来“通知”垃圾回收器运行。但这样可能会造成性能问题,不推荐这样去做。

5、Java是否存在内存泄漏问题?

存在。内存泄漏指的式一个不再被程序使用的对象或变量还在内存中占据着存储空间,并没有被回收。

判断一个内存空间是否符合垃圾回收的标准有两个:一、给对象赋值了null,以后再没有被使用过;二、给对象赋值了新值,重新分配了内存空间。

而一般而言,内存泄漏也主要是两种情况:一是再堆中的空间没有被释放,二是对象已不再使用,但是还仍在内存中保留着。Java中因为垃圾回收器,所以主要存在的是第二种内存泄漏。

引起内存泄漏的原因有很多,主要有以下几个方面

①、静态集合类。像HashMap和Vector。如果这些容器为静态的,那么它们的生命周期就会和程序一致,直到程序结束之前,容器中的对象将不会被释放,从而造成内存泄漏。

②、各种连接,例如数据库连接、网络连接以及IO连接等。如果不手动的去close,那么就会造成大量的对象无法被回收从而引起内存泄漏。例如Connection、Statement或ResultSet等。

③、监听器。也需要对应的删除,不然会造成内存泄漏。

④、变量不合理的作用域。使用范围远小于定义的作用域,也会造成内存泄漏。

⑤、单例模式可能会造成内存泄漏。

6、Java中的堆和栈有什么区别?

栈内存主要用来存放基本数据类型和引用变量,而堆内存用来存放运行时创建的对象。

从对堆和栈的功能以及作用来比较,堆主要用来存放对象的,栈主要用来执行程序的。较于堆,栈的存取速度更快,但栈的大小和生存期必须是确定的,因此缺乏一定灵活性。而堆可以在运行时动态地分配内存,生存期不用提前告诉编译器,但这也导致了其存取速度的缓慢。

由于i 为基本数据类型的局部变量,因此它存储在栈空间中,而r为对象的引用变量,因此也被存储在栈空间中;实际的队形存储在堆空间中,当main()方法退出后,存储在栈中的i和r通过压栈和弹栈操作将会在栈中被回收,而存储在堆中的对象将会由垃圾回收器来自己动回收。

转载麻烦请附录地址,感谢大家配合!!!
https://blog.csdn.net/HOLLOWYANG/article/details/119986858

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值