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程序的开发中,由于本身硬件资源的短缺,我们更加要学会是使用这些机制去优化我们的程序。

原文地址:https://www.cnblogs.com/YjfDIY/p/9609041.html

时间: 2024-10-08 20:28:51

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

java后台面试题整理(包含)

1.Arrays.sort实现原理和Collection实现原理 Collection.sort()底层会调用Arrays.sort(),Arrays.sort()底层实现是TimeSort,TimeSort的算法就是先找到已经排好序数据的子序列,然后对剩余部分数据进行排序,然后在合并起来. 2.foreach和while的区别(编译之后) while会读一行输入,把它存入某个变量并执行循环体,然后再找其他行的输入,适用于不确定循环次数的情况:foreach是增强for循环,它是逐条读取,在循环

一家小公司的Java后台面试题

少爷自知在编程这一行没什么过多的天分,资质平平,但自己做的选择,就要为之努力奋斗. 前几天内推阿里,被弄错部门之后,杳无音信,于是便投了一家小公司,当天收到面试通知,去到直接是30分钟做题,总共16题,还算简单,不过仍有不足之处,少爷只拿到了前12题的题目,所以还是先记下来,以备复习. 1.反射中,Class.forName和Classloader.loadClass的区别. 2.描述一下如何定位和处理java内存泄漏的问题. 3.运行时异常和非运行时异常,各举个例子. 4.如果不让你用java

Java笔试面试题整理第八波

本系列整理Java相关的笔试面试知识点,其他几篇文章如下: Java笔试面试题整理第七波 Java笔试面试题整理第六波 Java笔试面试题整理第五波 Java笔试面试题整理第四波 Java笔试面试题整理第三波 Java笔试面试题整理第二波 Java笔试面试题整理第一波 1.运算符相关 What results from the following code fragment? inti = 5; intj = 10; System.out.println(i + ~j); A.Compilati

Java笔试面试题整理第一波

(本系列同步更新于 个人博客小站) 本系列整理Java相关的笔试面试知识点.其它几篇文章例如以下: Java笔试面试题整理第八波 Java笔试面试题整理第七波 Java笔试面试题整理第六波 Java笔试面试题整理第五波 Java笔试面试题整理第四波 Java笔试面试题整理第三波 Java笔试面试题整理第二波 Java笔试面试题整理第一波 1.Java变量 Java中主要有例如以下几种类型的变量 局部变量 类变量(静态变量)-- 属于类 成员变量(非静态变量)-- 属于对象 2.关于枚举 pack

Java笔试面试题整理第四波

1.HashMap.HashTable.ConcurrentHashMap的区别 [参考:http://www.cnblogs.com/carbs/archive/2012/07/04/2576995.html] (关于HashMap的分析,在第三篇总结<Java笔试面试题整理第三波>中的hashCode有分析,同样在这篇中有关于Java容器的介绍.HashMap和HashTable都属于Map类集合.) HashMap和HashTable都实现了Map接口,里面存放的元素不保证有序,并且不存

java多线程面试题整理及答案(2018年)

java多线程面试题整理及答案(2018年) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支 持,它也是一个很好的卖点. 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所

Java工程师笔试题整理[校招篇]

隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打好Java基础:如何一步一步的学Java - 学习编程 - 知乎专栏.然后再来看一下练习一下各大厂的面试笔试题目. 如果以下内容满足不了你,你还可以去看这篇: 2016校招编程题汇总 - 学习编程 - 知乎专栏 进入主要内容(主要内容整理来自牛客网:牛客网)(以下内容按照各大公司进行划分,对每一公司按照年份进行划分,如果想想下载以下内容,可以

Java实习生面试题整理

一.数据类型 包装类型 八个基本类型: boolean/1 byte/8 char/16 short/16 int/32 float/32 long/64 double/64 基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成. ? 1 2 Integer x = 2;     // 装箱 int y = x;         // 拆箱 缓存池 new Integer(123) 与 Integer.valueOf(123) 的区别在于: new Intege

Java笔试面试题整理第六波(修正版)

1.线程池ThreadPool相关 在java.util.concurrent包下,提供了一系列与线程池相关的类.合理的使用线程池,可以带来多个好处: (1)降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗: (2)提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行: (3)提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控. 线程池可以应对突然大爆发量的访问,通过有限个固定线