收藏 分享(赏)

java后端面试资料.docx

上传人:cjc2202537 文档编号:740308 上传时间:2018-04-20 格式:DOCX 页数:28 大小:169.13KB
下载 相关 举报
java后端面试资料.docx_第1页
第1页 / 共28页
java后端面试资料.docx_第2页
第2页 / 共28页
java后端面试资料.docx_第3页
第3页 / 共28页
java后端面试资料.docx_第4页
第4页 / 共28页
java后端面试资料.docx_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、需要掌握的知识点对于项目1. 明确你的项目到底是做什么的,有哪些功能2. 明确你的项目的整体架构,在面试的时候能够清楚地画给面试官看并且清楚地指出从哪里调用到哪里、使用什么方式调用3. 明确你的模块在整个项目中所处的位置及作用4. 明确你的模块用到了哪些技术,更好一些的可以再了解一下整个项目用到了哪些技术专业技能1. 基本语法:这包括 static、final 、transient 等关键字的作用,foreach 循环的原理(语法糖,其实还是使用了 Iterator 遍历)等等。今天面试我问你 static 关键字有哪些作用,如果你答出 static 修饰变量、修饰方法我会认为你合格,答出静态

2、块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满意,因为能看出你非常热衷研究技术。2. 集合:基本上就是 List、 Map、Set,问的是各种实现类的底层实现原理,实现类的优缺点。集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet 的实现原理,能流利作答,当然能掌握 CopyOnWrite 容器和 Queue 是再好不过的了。另外多说一句,ConcurrentHashMap 的问题在面试中问得特别多,大概是因为这个类可以衍生出非常多的问题,关于 ConcurrentHashM

3、ap,我给网友朋友们提供三点回答或者是研究方向:(1)ConcurrentHashMap 的锁分段技术(2)ConcurrentHashMap 的读是否要加锁,为什么(get 操作不需要锁。第一步是访问 count 变量,这是一个 volatile 变量,由于所有的修改操作在进行结构修改时都会在最后一步写 count 变量,通过这种机制保证 get 操作能够得到几乎最新的结构更新。对于非结构更新,也就是结点值的改变,由于 HashEntry 的 value 变量是 volatile 的,也能保证读取到最新的值。 ) (3 )ConcurrentHashMap 的迭代器是强一致性的迭代器还是弱一

4、致性的迭代器(弱一致性) 。3. 设计模式:面试中关于设计模式的问答主要是三个方向:(1 )你的项目中用到了哪些设计模式,如何使用(2 )知道常用设计模式的优缺点(3 )能画出常用设计模式的UML 图4. 多线程:线程池也是比较常问的一块,常用的线程池有几种?这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?实际一些的,会给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合。多线程同步、锁这块也是重点。synchronized 和 ReentrantLock 的区别、synchronized 锁普通方法和锁静态方法、死锁的原理及排查方法等等。5. JDK 源码:比较重要的

5、源码:(1)List、Map、Set 实现类的源代码(2)ReentrantLock、AQS 的源代码(3 )AtomicInteger 的实现原理,主要能说清楚 CAS 机制并且 AtomicInteger 是如何利用 CAS 机制实现的(4)线程池的实现原理(5)Object 类中的方法以及每个方法的作用6. 框架:一些基本的应用。7. 数据库:一些基本的像 union 和 union all 的区别、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化。8. 数据结构与算法:数组、链表是基础,栈和队列深入一些但也不难,树挺重要的,比较重要的树 AVL 树、红黑树,

6、可以不了解它们的具体实现,但是要知道什么是二叉查找树、什么是平衡树,AVL 树和红黑树的区别。9. Java 虚拟机: Java 虚拟机中比较重要的内容:(1) Java 虚拟机的内存布局(2)GC 算法及几种垃圾收集器(3 )类加载机制,也就是双亲委派模型(4 )Java 内存模型(5)happens-before 规则(6 )volatile 关键字使用规则10. Web 方面的一些问题:谈谈分布式 Session 的几种实现方式;讲一下 Session 和 Cookie的区别和联系以及 Session 的实现原理。web.xml 里面的内容是重点,Filter、 Servlet、List

7、ener ,不说对它们的实现原理一清二楚吧,至少能对它们的使用知根知底。另外,一些细节的方面比如 get/post 的区别、forward/ 重定向的区别、HTTPS的实现原理也都可能会被考察到。Java 基础1. 如何实现在 main()方法执行之前输出东西? 使用静态代码块。静态代码块在类加载时就会调用。2. Java 程序初始化的顺序?父类静态变量- 父类静态代码块-子类静态变量- 子类静态代码块-父类非静态变量 -父类非静态代码- 父类构造函数-子类非静态变量-子类非静态代码-子类构造函数。3. 普通方法可以与构造函数方法名一样4. 为什么 Java 中有些接口没有任何方法?这些叫做标

8、识接口,仅仅充当标识的作用,类似于汽车的标签。比如 cloneable 接口以及 serializable 接口。5. Java 中 clone 方法的作用?返回一个对象的复制。这个复制对象是一个新的对象而不是原来对象的引用。如果用“=”得到的是这个对象的引用。只有基本数据类型是值传递。6. 使用 clone()方法?首先需要继承 cloneable 接口,在 clone 方法中调用super.clone(),然后在 clone 方法中把浅复制的引用指向原型对象新的克隆体。7. 浅复制和深复制的区别?浅复制只考虑所复制的对象,不复制它所引用的对象。8. 反射机制?反射机制能够实现在运行时对类进

9、行装载。反射能使得代码编写更加灵活。常用于一些框架的开发。内省 API(通过反射的方式操作JavaBean 的属性) 。9. Java 创建对象的方式?new 、反射、clone()、反序列化。10. 面向对象的三大特征?继承、多态、封装。 (继承破坏封装性,怎么看?)11. 组合和继承的不同?继承是 is a 的关系,而组合是 has a 的关系。能用组合就不用继承。12. 多态的实现机制:方法的重载(编译时多态性) ,方法的覆盖(运行时多态)。13. 重载和覆盖的区别?覆盖是子类与父类之间的关系,重载是一个类中方法之间的关系。覆盖要求参数列表一样,重载要求参数列表不一样。14. 抽象类与接

10、口?15. 内部类?静态内部类(static,不依赖于外部类就可以实例化) 、成员内部类(不可以定义静态的属性和方法) 、局部内部类(不能被public、 private、protected、static 修饰,只能访问 final 类型的局部变量) 、匿名内部类(没有名称的内部类,没有构造函数,必须继承其他类或者其他接口,不能定义静态成员以及方法,只能创建一个实例) 。16. 如何获取父类的类名?不能用 super.getClass().getName(),要使用this.getClass().getSuperclass().getName()。 (getClass 是 object 的 f

11、inal 方法,不能被覆盖,返回的是此 object 运行时的类。 )17. This 与 super 的区别?18. Static 关键字的作用?为某个特定的数据类型或对象分配单一的存储空间;实现某个方法或者属性与类关联而不是与对象关联。19. Static 实现单例?20. Static 与 final 结合使用表示该方法不可覆盖而且可以通过类名直接访问。21. Volatite 是设计被用来修饰不同线程访问和修改的是同一个变量。22. Strictfp 是精确浮点,用来确保浮点运算的准确性。23. 什么是不可变类?不可变类是指当创建这个类的实例之后,就不允许修改他的值了。所有基本类型的包

12、装类(Integer、Float 等,string) 。创建不可变类要遵循的原则(类中的成员变量都被 private 修饰,类中没有修改成员变量的方法,确保所有方法不会被子类覆盖)24. 不可变类的优缺点?优点:使用简单,线程安全,节省内存。缺点:会因为值的不同而产生新的对象。25. 在 Java 中,原始数据类型在参数传递时是按值传递,而包装类型是按引用传递的。26. Math 类中的 round,ceil ,floor?27. Char 类型变量是否可以用来存储一个中文汉字?可以28. 判断是否存在中文字符?str.length()=str.getBytes().length29. 实现国

13、际化的应用常见的手段是?利用 ResourceBundle 类。30. New String(“abc”)创建了几个对象?一个或者两个。31. “=”、equals、hashCode 有什么不同?“= ”是比较两个变量的值是否相等。在内存中所存储的值是否相等。即引用类型的引用和基本数据类型,比较的是引用。Equals 如果没有被重写那么也是比较引用,和“=”一样。但是像 String 被覆盖之后就是比较字符串的值了。hashCode 是鉴定两个对象是否相等。Equals 相等则 hashCode 也必须相等, equals 不相等,hashCode 可以不相等也可以相等。 hashCode 不

14、相等则 equals 也不相等,hashCode 相等,则 equals 可以相等也可以不相等。32. 当一个字符串需要经常被修改时,使用 stringBuffer 比使用 string 要好很多。StringBuffer 是线程安全的, StringBuider 不是线程安全的。执行效率方面,StringBuilder 最高,StringBuffer 次之,string 最低。33. 字符串 String 修改实现原理?34. Java 中数组是不是对象?是对象,每个数组都有其对应的类型,可以通过instanceof 来判断。 (a instanceof int)35. Length 属性与

15、 length()方法?length 是数组的属性用于获取数组的长度,而length()是字符串的方法用于计算字符串的长度。36. Finally 块中的代码什么时候执行?finally 块里的代码是在 return 之前执行的,如果有 return 语句会覆盖别处的 return 语句。对于基本数据类型,在finally 块中改变 return 的值对返回值没有任何影响,而对引用类型的数据会有影响。37. Finally 代码块也是不一定被执行的。在进入 try 语句之前已经报了异常;程序执行时遇到强制退出。38. 运行时异常与普通异常?异常类(error 和 exception) ;exc

16、eption 又包括检查异常(IO 异常、SQL 异常)和运行时异常(空指针异常、类型转换异常、数组越界异常、数组存储异常、算术异常、缓冲区溢出异常) 。39. 异常处理时需要注意的地方?先捕获子类异常,然后在捕获基类异常;尽早抛出异常并进行处理;自定义异常;异常能处理就处理40. JVM 类加载机制?隐式加载和显示加载两种。Bootstrap loader 加载系统类ExtClassLoader 加载扩展类AppClassLoader 加载应用类。41. 类加载的主要步骤:装载链接(检查;准备;解析)初始化42. 什么是垃圾回收(GC)?回收程序中不在使用的内存。垃圾回收器使用有向图来进行记

17、录和管理内存中的所有对象,识别对象是否是“可达的” ,有引用变量引用的就是可达对象。不可达的对象都会被垃圾回收器回收。43. 垃圾回收算法?引用计数算法(引用计数器,被引用就加 1,释放引用时减1。无法解决相互引用的问题) ;追踪回收算法(利用 JVM 的对象有向图,标记遍历的对象,回收没有被标记的对象) ;压缩回收算法(把堆中活动的对象移动到堆的一端,留出一大块空闲区域,相当于进行了碎片处理) ;复制回收算法(将堆分成两个一样的区域,只有其中的一个区域被使用,直到这个区域被消耗完,程序会将所有活动的对象复制到另外一个区域,如此循环) ;按代回收算法(把堆分成很多个子堆,每个子堆就视为一代。优

18、先搜集年幼的对象,如果多次搜集任然存活,就把该对象转移到高一级堆中,减少对其的扫描)44. Java 是否存在内存泄露(OOM,OutOfMemory)问题?存在。内存泄露的两种情况:堆中申请的空间没有被释放;对象已经不再被使用但还是在内存中保留。45. Java 中引起内存泄露的原因,举几个例子?静态集合类(Vector,HashMap);各种连接(数据库连接,IO 连接) ;监听器;变量不合理的作用域(变量生命周期与程序的生命周期一致) ;单例模式可能造成 OOM。46. Java 中堆和栈的区别?栈内存主要用于存放基本数据类型以及引用变量,堆内存用来存放运行时创建的对象(一般来说 new

19、 处理的对象) 。常量池是存放字符串常量以及基本数据类型常量。线程之间共享堆内存,所有多线程要对数据进行同步。从功能上看,堆是主要用来存放对象的,栈主要用来执行程序的。47. 容器数据结构:列表,队列,集合,栈,映射表(list,queue,set,stack,map )48. 当一个集合被作为参数传递给一个函数时,如何才可以确保函数不能修改它?在作为参数传递之前,我们可以使用Collections.unmodifiableCollection(Collection c)方法创建一个只读集合,这将确保改变集合的任何操作都会抛出 UnsupportedOperationException。49.

20、 .大写的 O 是什么?举几个例子?大写的 O 描述的是,就数据结构中的一系列元素而言,一个算法的性能。Collection 类就是实际的数据结构,我们通常基于时间、内存和性能,使用大写的 O 来选择集合实现。比如:例子 1:ArrayList 的 get(index i)是一个常量时间操作,它不依赖 list 中元素的数量。所以它的性能是 O(1)。例子 2:一个对于数组或列表的线性搜索的性能是 O(n),因为我们需要遍历所有的元素来查找需要的元素。50. Hashmap 是基于散列表实现的,而 Treemap 是基于红黑树实现的。51. Iterator 与 ListIterator 的区

21、别?Iterator 只能正向遍历集合,适合于获取移除元素,ListIterator 可以支持元素的修改。52. 线程安全的容器?vector、hashtable53. Linklist 用于随机访问的效率较低,主要用于对数据指定位置的插入或是删除操作。主要操作为索引时应该使用 vector 或 arrylist。54. Hashmap 允许空键值,但最多允许一条记录的键值为空。而 hashtable 不允许。Hashtable 使用的是 Enumeration,hashmap 使用的是 Iterator。55. Hashtable 的同步指的是什么?同步意味着在一个时间点只能有一个线程可以修

22、改 hash 表,任何线程在执行 hashtable 的更新操作前都需要获取对象锁,其他线程则等待锁的释放。56. 如何实现 hashmap 的同步?通过 Collections 的 synchizedMap()方法。57. Hashmap 中使用链地址法来解决 hash 冲突(不同的 key 值得到相同的 hash值) 。58. 在使用自定义的类作为 hashmap 的 key 时需要注意:一般需要重写 equals和 hashCode 方法;最好把这个类设计成不可变类。59. 与 Java 集合框架相关的有哪些最好的实践?(1)根据需要选择正确的集合类型。比如,如果指定了大小,我们会选用A

23、rray 而非 ArrayList。如果我们想根据插入顺序遍历一个 Map,我们需要使用 TreeMap。如果我们不想重复,我们应该使用 Set。(2)一些集合类允许指定初始容量,所以如果我们能够估计到存储元素的数量,我们可以使用它,就避免了重新哈希或大小调整。(3)基于接口编程,而非基于实现编程,它允许我们后来轻易地改变实现。(4)总是使用类型安全的泛型,避免在运行时出现 ClassCastException。(5)使用 JDK 提供的不可变类作为 Map 的 key,可以避免自己实现hashCode()和 equals()。(6)尽可能使用 Collections 工具类,或者获取只读、同

24、步或空的集合,而非编写自己的实现。它将会提供代码重用性,它有着更好的稳定性和可维护性。60. 线程和进程?进程是指一段正在执行的程序(应用程序执行的最小单元) ;线程是指程序代码的一个执行单元。线程拥有自己的栈,但是共享堆。61. 多线程的优势?减少程序的响应时间;线程的创建和切换开销更小;提高CPU 的利用率;简化程序的结构。62. 同步和异步的区别?多线程同时对同一数据进行操作时,同步机制是指只能有一个线程对其进行读写,其他线程进入等待状态,直到线程结束对该资源的使用。异步是指每个线程都包含运行时自身所需要的数据和方法,不必关心其他线程的状态或行为。简单来说,同步就是我喊你吃饭,如果你没听

25、到就一直喊你直到你和我一起去吃饭;而异步就是我喊你去吃饭但是不管你有没有回应我自己都去吃饭了。63. 实现同步的方式:利用同步代码块;利用同步方法来实现同步。64. 什么是死锁(deadlock)?两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。65. 如何确保 N 个线程可以访问 N 个资源同时又不导致死锁?使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。66. .创建线程有几种不同的方式?你喜欢哪一种?为什么?有三种

26、方式可以用来创建线程:继承 Thread 类;实现 Runnable 接口;应用程序可以使用 Executor 框架来创建线程池实现 Runnable 接口这种方式更受欢迎,因为这不需要继承 Thread 类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而 Java 不支持多继承) ,只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。67. 一个类是否可以同时继承 Thread 与实现 Runable 接口?可以。68. Run 方法和 start 方法有什么区别?run 只是跑一次方法,start 才是正在启动一个线程。69. 多线程同步实现方法有哪些?synchroni

27、zed 关键字( synchronized 方法和synchronized 块) ;wait 和 notify 方法;lock (lock() :以阻塞的方式获取锁。tryLock():以非阻塞方式返回锁。 )70. Sleep 不会释放锁,而 wait 会释放锁。71. Synchronized 与 lock 有什么不同? synchronized 使用 object 对象本身的notify、wait、notifyAll 调度机制。而 lock 可以使用 condition 进行线程之间的调度,完成 synchronized 实现的所有功能。72. 当一个线程进入一个对象的一个 synchr

28、onized()方法之后,其他线程是否可以进入该对象的其他方法?同步静态方法也是可以调用的。静态方法同步锁是当前类的字节码,非静态方法的同步锁是 this。如果这个方法的内部调用了 wait()方法,那么其他线程就可以访问同一对象的其他 synchronized 方法。如果没有 wait()方法并且其他方法都是 synchronized 的方法,那么就不能访问这个对象的其他方法。73. 什么是守护进程?是指在程序运行时在后台提供一种通用服务的线程。守护线程一个例子就是垃圾回收器。74. Join()方法的作用是让调用该方法的线程在执行完 run()方法后在执行 join 后面的代码。75. J

29、dbc 处理事务采用的方法?commit()和 rollback()。76. 脏读、不可重复读、虚读?77. Class.forName()的作用是把类加载到 JVM 中。Statement 用于执行不带参数的简单 SQL, preparedStament 表示预编译的 SQL 语句的对象用于执行带参数的预编译 SQL 语句。CallableStatement 则表示提供用来调用数据库存储过程的接口。78. JDO 是什么?JDO 是 Java 数据对象,一个用于存取某种数据仓库中的对象的标准化 API,它使开发人员能够间接地访问数据库。79. JDBC 与 hiernate 以及 mybat

30、is 有什么区别?Hibernate 以及 mybatis 是 JDBC的封装,对数据库的访问还是通过 JDBC 完成的。80. Class.forName()和 loadClass 的区别?loadClass 加载类时可以选择是否对类进行解析和初始化,而 forName 加载的时候会将 Class 进行解析和初始化。81. JVM 使用哪种字符表示?Unicode characters82. 什么时候用 assert?assert 是断言,断言是一个包含布尔表达式的语句,一般用于调试目的。83. (A 编译阶段的指令,在编译时就替换了最终形成文件,只有第一次请求时执行。是静态导入。Inclu

31、de 动作:。这是运行时的语法,主页面被请求时才会被包含进来,类似于方法调用,每次请求都会执行。是动态导入。17. 会话跟踪技术?page(pagecontext 域) request(request 域) session(session 域) application(servletcontext 域)18. 保存会话数据的技术?cookie 和 session。cookie 是一种浏览器端的缓存技术, 而 Session 是一种服务器端的缓存技术( 依赖 cookie)19. 登陆功能是用 Session 实现的,就是向 Session 对象中保存当前用户的对象。自动登录的功能用 Cooki

32、e 实现, 就是登陆时将用户的信息保存为持久化 Cookie 下次访问时, 读取请求中如果有用户信息的 Cookie 就可以自动登陆。20. 如何防止表单重复提交?使用 session 技术。添加一个隐藏域,生成一个随机值,存入 session 中,处理请求时取出值进行比较,相等说明不是重复提交,不相等则说明是重复提交。21. 什么是 AJAX?AJAX 技术是客户端技术,是一种支持异步请求的技术。22. 什么是 JavaEE?JavaEE 是一个行业标准,主要通过 Java 开发服务器端应用提供一个独立的,可移植的,多用户的企业级平台,从而简化程序的开发和部署。23. JavaEE 常用的术

33、语?Web 服务器(IIS 和 Apache) ,web 容器(Tomcat,Jboss 等) ,EJB 容器,Applet 容器,appilcation client 容器,JDNI(Java 命名和目录接口) ,JMS(Java 消息服务) ,JTA(Java 事务服务,用于分布式事务等) ,JAF(JavaBean 激活框架,用于数据处理) ,RMI(远程方法调用)等。24. 什么是 webservice?是一种基于网络的分布式模块化组件。基于以下一些协议来实现:XML ,WSDL,UDDI,SOAP。25. SOAP 与 REST 的区别?SOAP 数据使用 XML 数据格式,定义了一

34、整套复杂的标签。REST 是面向资源的。JVM1. Java 字节码文件的格式2. 内部类的存储方式3. 垃圾回收器的分类及优缺点4. 类在虚拟机中的加载过程5. 即时编译器的前后端优化方法6. CMS 垃圾回收器的工作过程7. CAS 指令以及其他线程安全的方法8. 各种内存溢出的情况,包括 JNI 调用1. Java 的内存区域? Java 运行时数据区主要有程序计数器(一块较小的内存区域,线程私有,执行 Java 方法计数器记录的是正在执行的虚拟机字节码指令的地址;执行 native 方法,这个计数器为空( undefined) 。这个内存区域是唯一一个在 Java 中没有定义 OOM

35、的区域) ;虚拟机栈(线程私有,生命周期与线程相同,为虚拟机执行 Java 方法或是字节码服务的,存放基本数据类型以及引用变量和 returnAddress 类型:指向了一条字节码指令的地址。这个区域存在两种异常:线程请求的栈深度大于虚拟机所提供的深度抛出 StackOverflowError;动态扩展大于虚拟机栈固定长度则抛出OutOfMemoryError 异常) ;本地方法栈(为虚拟机使用到的 native 方法服务。) ;堆(线程共享,在虚拟机启动时创建,存放对象实例以及数组。也被成为 GC 堆,现在的垃圾回收算法是分代收集算法,Java 堆还可以分为新生代和老生代。如果在堆中没有内存

36、完成实例分配,并且堆无法扩展,就会抛出 OOM 异常) ;方法区(线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码数据等。当方法区无法满足内存分配时就会抛出 OOM 异常) ;常量池(是方法区的一部分)2. 虚拟机中对象创建的过程(new 指令)?检查指令的参数是否能在常量池中定位到一个类的符号引用,检查这个类是否已被加载,解析和初始化,如果没有就要进行类加载。类加载检查为新生对象分配内存(指针碰撞、空闲列表)内存空间初始化零值设置对象执行 init 方法。3. 对象的内存布局?对象在内存中存储的布局可以分为 3 块区域:对象头(自身运行数据,指针类型) 、实例数据(

37、真正的有效信息) 、对齐填充(占位符) 。4. 对象的访问定位?Java 程序通过栈上的 reference 数据来操作栈上的具体对象。主流的访问方式有句柄和直接指针。5. 应对解决 OutOfMermoryError(OOM)Java 堆内存问题?先通过内存映像分析工具对 dump 出来的堆转储快照进行分析,确认是内存泄露还是内存溢出。如果是内存泄露,进一步通过工具查看泄露对象到 GC Roots 的引用链,就可以知道对象是怎样通过与 GC Roots 关联而导致 GC 不能自动回收的,这样就可以准确的定位出泄露的位置了。如果不存在泄露,那就是说内存中对象却是还是活着,那就要检查虚拟机的堆参

38、数,与机器物理内存对比看看是否还可以调大,从代码上检查是否存在某些对象生命周期过长,持有状态时间过长的情况,尝试减少程序运行期间的内存消耗。6. 栈内存溢出?栈空间无法继续分配。内存太小(StackOverflowError) ;已使用的栈空间太大(OutOfMemoryError) 。在单线程下,无论是栈容量太小还是栈帧太大,都是抛出 StackOverflowError。7. 方法区和运行时常量池溢出?PermGen space intern()方法。8. 本机直接内存溢出?9. 判读对象已死?引用计数算法(好处:实现简单,判定效率也高。缺点:不能解决对象之间相互循环引用的问题) ,但是一

39、般不推荐引用计数法。推荐使用可达性分析算法,通过一系列的 GC Roots 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有引用链相连时则说明这个对象是不可用的。10. 哪些对象可以作为 GC Roots?虚拟机栈中引用的对象,方法区中类静态属性引用对象,方法区中常量引用的对象,本地方法栈中 JNI 引用的对象。11. 对象生存还是死亡,要经过两次标记?GC Roots 引用链一次标记finalize()F-Queue 队列 Finalizer 线程GC 二次标记回收,任何一个对象的 finalize 方法只会被系统自动调用一次,如果对象面临下一次回收,就不会再调用 finalize 了。12. 无用的类?该类的所有实例都已经被回收;加载该类的 classloader 已经被回收;该类对应的 java.lang.Class 对象已经没有任何引用,无法再任何地方进行反射访问该类。13. 垃圾收集算法?标记-清除算法(最基础的收集算法,但是存在两个问题:效率问题,空间问题(内存碎片) ) 。复制算法(将内存按容量划分为大小

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报