java后台面试题整理及解答(二)JVM相关篇

 

类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,

先静态、先父后子。 
先静态:父静态 > 子静态 
优先级:父类 > 子类 静态代码块 > 非静态代码块 > 构造函数 
构造函数,字段,他们的执行顺序 

一个类的实例化过程: 
1,父类中的static代码块,当前类的static 
2,顺序执行父类的普通代码块 
3,父类的构造函数 
4,子类普通代码块 
5,子类(当前类)的构造函数,按顺序执行。 
6,子类方法的执行,


JVM内存分代 

 

 

Java 8的内存分代改进 

  从永久代到元空间,在小范围自动扩展永生代避免溢出

JVM垃圾回收机制,何时触发MinorGC等操作 

  堆内存分为 年轻代 老年代 和持久代。
  年轻代 又分为 eden 区和 survivor 区。
  这两个区如果满了 触发的就是 minor gc。


新生代和老生代的内存回收策略 

  新生代中采用的收集算法:复制算法。算法的思想是将可用内存分为大小相等的两块,每次使用其中一块,当一块内存用完了,就将还存活的对象分到另一块。然后把使用过的       内存空间一次进行清理。

  老年代中采用的收集算法:标记-整理算法。算法思想:首先标记需要回收的对象,然后让所有存活的对象向一端移动,然后直接清理掉边界以外的内存。
Eden和Survivor的比例分配等 
深入分析了Classloader,双亲委派机制 

ClassLoader

ClassLoad:类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。

双亲委派机制

某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。




JVM常用参数 

   https://blog.csdn.net/csujiangyu/article/details/52071473
tomcat结构,类加载器流程 

  https://blog.csdn.net/fuzhongmin05/article/details/57404890
 

说一下强引用、软引用、弱引用、虚引用以及他们之间和gc的关系

 

1 、强引用

 

只要程序通过 new 关键字创建了对象,那么垃圾回收期永远不会进行对对象的回收,除非是系统内存不够,即便如此,JVM也就只是抛出OutOfMemory()异常,当然如果对象的引用被释放后。这个对象将会被释放掉。那么如何清空这个对象的引用呢?对象的引用是存放在JVM的栈内存中,所以我们清空栈里面的引用自然就清除了这个对象所占用的内存空间。

 

2 、软引用

 

非必须引用,当内存资源不够即将溢出时,这个时候GC将会对对象的内存空间进行回收,从而避免内存溢出错误的发生。如何实现软引用:

 

Object obj = new Object();

 

SoftReference<Object> sf  = new SoftReference<Object>(obj);

 

obj = null ;

 

sf.get(); // 这个时候sf是obj对象的一个软引用,通过get()方法可以获取到这个对象,当内存不足的时候可能返回 null ;

 

使用场景:当用户需要实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除部分缓存数据,从真正的来源查询相关数据。

 

3 、弱引用

 

第二次垃圾回收时回收,不管当前内存资源是否充足,这就是传说中的躺枪吧。。。。 如何实现弱引用:

 

Object obj = new Object ();

 

WeakReference<Object> wf = new WeakReference<Object>();// 创建弱引用对象

 

obj = null ;

 

wf.get(); // 有的时候回返回null

 

wf.isEnQueued(); // 返回是否被垃圾回收器标记为即将回收的装状态
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnqueued方法返回对象是否被垃圾回收器标记。
4、虚引用(幽灵引用)
obj = null ;
pf.isEnQueued();//返回对象是否已经被清理的状态
虚引用主要用于检测对象是否已经从内存删除。

 

虚引用是话语权级别最低的引用了,只要垃圾回收开始工作,那么虚引用就会被回收。 实现方式:

 

Object obj = new Object ();

 

PhantomReference<Object> pf = new PhantomReference<Object>(obj);

 

pf.get();//永远返回null

 

三 、开发实战

 

作为一个初级的Java开发工程师,可能永远不会考虑JVM的内存问题,但是偶尔大家可能还是会出现OutOfmemory 错误的情况,例如部署一个较大的Tomcat

 

web服务其实在这个时候大家不需要惊慌,通常我们可以配置Tomcat的配置文件增大内存,或者JVM的内存设置,同时我们还可以通过JVM的GC机制来对程序进行一

 

定的优化,例如使用软引用,可以一定程度的促进GC的回收,从而避免内存溢出的情况。

 

尤其是在Android程序的开发中,由于本身硬件资源的短缺,我们更加要学会是使用这些机制去优化我们的程序。

 

posted @ 2018-09-08 13:55  Yjf_C-o  阅读(255)  评论(0编辑  收藏  举报