Java面试总结——平台与内存原理

1.JVM加载class文件的原理机制是什么
当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序,这个加载过程是由**类加载器(ClassLoader)**来完成的。

隐式加载 显式加载
使用new等方式创建对象时,隐式调用类加载到JVM 直接调用class.forName()方法把所需的类加载到JVM中

Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。
Java的类加载器有三个,对应Java的三种类:

 Bootstrap Loader  // 负责加载系统类 (指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类)
        | 
      - - ExtClassLoader   // 负责加载扩展类(就是继承类和实现类)
                      | 
                  - - AppClassLoader   // 负责加载应用类(程序员自定义的类)

三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了委托模型机制
委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。
我们可以通过这样的代码来获取类加载器:

ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();

前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:

1.装载:查找和导入class文件;

2.连接:

  (1)检查:检查载入的class文件数据的正确性;

  (2)准备:为类的静态变量分配存储空间;

  (3)解析:将符号引用转换成直接引用(这一步是可选的)

3.初始化:初始化静态变量,静态代码块。

  这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。
2.什么是GC(Garbage Collection)

垃圾回收主要作用是回收程序中不再使用的内存。c/c++需要开发人员仔细地管理好内存分配与释放,java语言则提供了垃圾回收器来自动检测对象的作用域,可以自动地把不再使用的存储空间释放掉。垃圾回收器主要负责完成以下3项任务:分配内存、确保被引用对象的内存不被错误地回收以及回收不再引用的对象的内存空间。
判断一个对象是否应该被回收(哪些内存需要回收)
(1)引用计数法
(2)对象可达性分析。由于引用计数法存在互相引用导致无法进行GC的问题,所以目前JVM虚拟机多使用对象可达性分析算法。该方法的基本思想是通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。
判断什么时候回收
即使是被判断不可达的对象,也要再进行筛选,当对象没有覆盖finalize()方法,或者finalize方法已经被虚拟机调用过,则没有必要执行;
如果有必要执行——放置在F-Queue的队列中——Finalizer线程执行。
如何进行回收
常用的垃圾回收算法:
(1)标记 -清除
不足:效率问题;空间问题(会产生大量不连续的内存碎片)
(2)标记-整理
把堆中活动的对象移动到一端,这样就会在堆中另外一端留出很大的一块空闲区域。简化消除碎片的工作、但是带来了性能的损失。
(3)标记-复制
将可用内存按容量分为大小相等的两块,每次都只使用其中一块;
可以消除内存碎片,对内存调整降低了程序执行的效率。
(4)分代回收
把堆分成两个或者多个子堆,每个子堆视为一代,优先收集年幼代,如果一个对象经过多次收集仍然存活,那么可以把这个对象转移到高一级的堆里,减少对其的扫描次数。

3.java中堆和栈有什么区别
比较
主要区别 存放基本数据类型与引用变量 存放运行时创建的对象(new)
功能及作用 用来执行程序 用来存放对象
存取速度 快 (大小和生存期确定,缺乏灵活性) 相对慢(动态分配内存、生存期不告诉编译器)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章