首页 > 编程语言 >Java面试题Day08

Java面试题Day08

时间:2023-01-11 14:56:56浏览次数:41  
标签:面试题 Day08 Java 对象 回收 GC 引用 加载

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

相关文章

  • JavaScript超大文件上传
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持......
  • Jmeter 加载Java代码并执行
    BeanShell中引用外部类,有三种方法:1)引用源文件,即.java文件。2)引用字节码文件,即.class文件。3)引用jar包,即.jar文件。方法1,引用源文件1)创建java文件publicclassTestA{......
  • 前端面试题与答案
    一、HTML+CSS部分()1、怎么让一个不定宽高的DIV,垂直水平居中?答:1)使用CSS方法:父盒子设置:display:table-cell;text-align:center;vertical-align:middle;Div设置:display:inline-blo......
  • Java8常见函数式接口总结
    函数式接口函数式接口:有且仅有一个抽象方法的接口。使用@FunctionalInterface注解来标记。如果接口不是函数式接口就会编译出错满足条件的接口即使不加上注解,那也是函......
  • 1.5万字总结 Redis 常见面试题&知识点
    以下内容来源于于我开源的JavaGuide(Java学习&&面试指南,Github130kstar,370人共同参与爱完善),万字总结,质量有保障!这篇文章最早写于2019年,经过不断完善,内容也更全面......
  • JavaScript – Sort
    前言写程序难免会遇到需要排序的时候.但看是简单的排序,其实暗藏杀机.一不小心就会搞出Bug哦.这篇就简单聊聊JS的排序 ><大过小过排序自然就是先比大小咯.......
  • 强哥说Java--Java集合
    Java集合​​Java集合​​​​前言​​​​目标​​​​1.什么是集合​​​​1.1Collection​​​​1.2Map​​​​2.集合的应用场景​​​​2.1数组与集合​​​​2......
  • 强哥说Java--Java String和StringBuilder
    目录​​JavaString和StringBuilder​​​​前言​​​​1.String对象的创建​​​​2.获取字符串长度​​​​3.字符串查找​​​​3.1获取指定位置字符​​​​3.2......
  • 强哥说Java--网络编程
    网络编程​​网络编程概述​​​​网络通信要素概述​​​​通信要素1:IP和端口号​​​​ip地址​​​​端口号​​​​InetAddress类​​​​实例​​​​通信要素2:网......
  • 强哥说Java--IO流
    IO流​​一、File类的使用​​​​路径分隔符​​​​常用方法​​​​二、IO流原理及流的分类​​​​JavaIO原理​​​​流的分类​​​​节点流和处理流​​​​InputStr......