1.强引用,软引用,弱引用,虚引用的区别?
强引用:我们平时new了一个对象就是强引用,例如 Object obj = new Object() ; 即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象,
软引用:如果对象只具有软引用,则内存空间足够,垃圾回收站就不会回收他;如果内存空间不足了,就会回收这些对象的内存.
SoftReference<String> softRef = new SoftReference<String>(str) ;//软引用
弱引用:具有弱引用的对象拥有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间是否足够,都i会
回收它的内存. String str = new String ("abc"); WeakReference<String> abcWeakRef = new WeakReference <String>(str);
虚引用:如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收,虚引用主要用来跟踪对象被回收期回收的活动.
2.有没有了解过GC?
GC是垃圾收集的意思
在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,
只有在虚拟机空闲或者当前,堆内存不足时,才会触发执行.
扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收.
3.垃圾回收期的原理是什么?有什么办法手动进行垃圾回收?
对GC来说,当程序员创建对象时,GC就开始监控这些对象的地址,大小以及使用情况.
通常GC采用有向图的方式记录和管理堆(heap) 中的所有对象.
通过这种方式确定哪些对象是"可达的", 哪些对象是"不可达的",当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间,
程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定执行.
4.讲一下新生代,老年代,永久代的区别?
在Java中,堆被划分成两个不同的区域:新生代(Young) 老年代(old)
划分的目的是为了使JVM能够更好的进行内存的分配以及回收,
新生代中一般保存新出现的对象,所以每次垃圾收集时都发现大批对象死去,只有少量对象存活,便采用了复制算法,只需要付出少量存活对象的复制成本,就可以完成收集,
老年代中一般保存存活了很久的对象,他们存活率高,没有额外空间,对它进行分配担保,就必须采用"标记-清理"或者"标记-整理" 算法.
永久代就是JVM的方法区,在这里都是放着一些被虚拟机加载的类信息,静态变量,常量等数据,这个区中的东西比老年代和新生代更不容易回收.
5.对象什么时候可以被垃圾回收站回收?
当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了.
垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)
6.什么是类加载器?
主要有以下四种类加载器:
(1)启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用
(2)扩展类加载器(extensions class loader) 它用来加载Java的扩展库,Java虚拟机的实现会提供一个扩展库目录,该类加载器再此目录里面查找并加载Java类.
(3)系统类加载器(system class loader) :它根据Java应用的类路径(CLASSPATH) 来加载Java类,一般来说,Java应用的类都是由它来完成加载的,可以通过ClassLoader.getSystemClassLoader()来获取它.
(4)用户自定义类加载器,通过继承java.lang.ClassLoader类的方式实现.
7.说一下类装载的执行过程?
类装载分为一下5个步骤:
加载:根据查找路径找到相应的class文件然后导入;
验证:检查加载的class文件的正确性;
准备:给类中的静态变量分配内存空间;
解析:虚拟机将常量池中的符号引用替换成直接引用的过程;
初始化:对静态变量和静态代码块执行初始化工作;
8.双亲委派
当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,
由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载.
9.JVM调优
JDK自带了很多监控工具,都位于JDK的bin目录下,
其中最常用的是jconsole和jvisualvm这两款视图监控工具.
jconsole:用于对JVM中内存,线程和类等进行监控;
jvisualvm:JDK自带的全能分析工具,可以分析:快照内存,线程快照,程序死锁,监控内存的变化,gc变化等.
10.解释下多线程
线程,线程就是程序的执行路径,或者可以说是程序的控制单元
一个进程可能包含一个或多个进程,当一个进程存在多条执行路径时,就可以将该执行方式称为多线程,
线程的执行方大致可分为就绪(wait),执行(run),阻塞(block)三个状态,多个线程在运行中相互抢夺资源,造成线程在上述的三个状态之间不断地相互转换,
标签:面试题,Day08,Java,对象,回收,GC,引用,加载 From: https://www.cnblogs.com/carney/p/17043384.html