200道面试题(自己在网络上搜集的答案)
原文链接:https://mp.weixin.qq.com/s/KnSUprd6Z7zbpZAVR1OEdw
1. Java 基础
1. JDK 和 JRE 有什么区别?
JDK(Java Development Kit) 是 Java 语言的软件开发工具包。JDK包含JRE。
JRE是Java Runtime Environment缩写,指Java运行环境。运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
2. == 和 equals 的区别是什么?
== 在比较基本数据类型的时候,比较的是值是否相等;在比较两个引用数据类型的对象的时候,比较的是其内存地址是否相等。
3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不一定,如果你重写了equals()方法,在hashCode()相同的时候,equals()可以不为true。
4. final 在 java 中有什么作用?
final修饰类,该类无法被继承;final修饰变量,该变量无法被修改;final修饰方法,该方法无法被重写。
5. java 中的 Math.round(-1.5) 等于多少?
-1
6. String 属于基础的数据类型吗?
不属于,它是引用数据类型。
7. java 中操作字符串都有哪些类?它们之间有什么区别?
StringBuilder ,StringBuffer两个类的作用基本相同,StringBuffer的大多数方法都有synchronized关键字修饰,它是线程安全的。
8. String str="i"与 String str=new String("i")一样吗?
不一样,String str="i" 直接指向常量池的“i”; String str=new String("i"),先在堆里开辟内存空间,其地址再指向常量池的字符串。两者==返回false, 用equals()返回true.
9. 如何将字符串反转?
StringBuilder方法直接反转;
循环一遍,挨个字符添加到新的字符串里,去反转;
用头尾两个指针,不断向中间移动,交换其字符串,直至相遇。
10. String 类的常用方法都有那些?
length();isEmpty();charAt(int index);getBytes();startsWith();endsWith();indexOf();lastIndexOf();substring();split();toLowerCase();toUpperCase();trim();toCharArray();intern();
11. 抽象类必须要有抽象方法吗?
抽象类不必须有抽象方法。
12. 普通类和抽象类有哪些区别?
1.抽象类不能被实例化。
2.抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
3.抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
4.含有抽象方法的类必须申明为抽象类
5.抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。
13. 抽象类能使用 final 修饰吗?
不能。一个类不能同时abstract和final.
14. 接口和抽象类有什么区别?
(1)抽象类可以有构造方法,接口中不能有构造方法。
(2)抽象类中可以有普通成员变量,接口中没有普通成员变量
(3)抽象类中可以包含静态方法,接口中不能包含静态方法
(4) 一个类可以实现多个接口,但只能继承一个抽象类。
(5)接口可以被多重实现,抽象类只能被单一继承
(6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
15. java 中 IO 流分为几种?
- 按照流的流向分,可以分为输入流和输出流;
- 按照操作单元划分,可以划分为字节流和字符流;
- 按照流的角色划分为节点流和处理流。
16. BIO、NIO、AIO 有什么区别?
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。
17. Files的常用方法都有哪些?
Files.exists() 检测文件路径是否存在
Files.createFile()创建文件
Files.createDirectory()创建文件夹
Files.delete() 删除文件或者目录
Files.copy() 复制文件
Files.move() 移动文件
Files.size()查看文件个数
Files.read() 读取文件
Files.write()写入文件
2. 容器
18. java 容器都有哪些?
Collection 和 Map 两大接口。Collection下有List, Set, Queue.
19. Collection 和 Collections 有什么区别?
Collection是接口,Collections是类。
20. List、Set、Map 之间的区别是什么?
List中的元素,有序、可重复、可为空;
Set中的元素,无序、不重复、只有一个空元素;
Map中的元素,无序、键不重,值可重、可一个空键、多可空值;
21. HashMap 和 Hashtable 有什么区别?
HashMap线程不安全,没有用sychronized关键字修饰,继承AbstractMap类。
Hashtable线程安全,绝大多数方法用synchronized关键字修饰,继承Dictionary类,
22. 如何决定使用 HashMap 还是 TreeMap?
无序的键值对HashMap, 有序的键值对(自然顺序或指定的comparator)TreeMap.
23. 说一下 HashMap 的实现原理?
https://baijiahao.baidu.com/s?id=1618550070727689060&wfr=spider&for=pc
24. 说一下 HashSet 的实现原理?
HashSet底层是一个HashMap, 都是调用的HashMap的方法实现的。
25. ArrayList 和 LinkedList 的区别是什么?
ArrayList 数组实现,随机访问,查询时间复杂度O(1) ,添加删除操作最坏要移动整个数组,时间复杂度O(n);
LinkedList 是链表结构,还实现了Deque双端队列,查询的时间复杂度可达O(n),添加删除操作O(1).
26. 如何实现数组和 List 之间的转换?
27. ArrayList 和 Vector 的区别是什么?
Vector 多数方法有synchronized关键字修饰,是线程安全的。
28. Array 和 ArrayList 有何区别?
29. 在 Queue 中 poll()和 remove()有什么区别?
1. queue的增加元素方法add和offer的区别在于,add方法在队列满的情况下将选择抛异常的方法来表示队列已经满了,而offer方法通过返回false表示队列已经满了;在有限队列的情况,使用offer方法优于add方法;
2. remove方法和poll方法都是删除队列的头元素,remove方法在队列为空的情况下将抛异常,而poll方法将返回null;
3. element和peek方法都是返回队列的头元素,但是不删除头元素,区别在与element方法在队列为空的情况下,将抛异常,而peek方法将返回null.
30. 哪些集合类是线程安全的?
二、线程安全(Thread-safe)的集合对象:
- Vector 线程安全:
- Hashtable 线程安全:
三、非线程安全的集合对象:
- ArrayList :
- LinkedList:
- HashMap:
- HashSet:
- TreeMap:
- TreeSet:
31. 迭代器 Iterator 是什么?
迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
32. Iterator 怎么使用?有什么特点?
33. Iterator 和 ListIterator 有什么区别?
我们在使用List,Set的时候,为了实现对其数据的遍历,我们经常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍历的过程,只需要每次取出一个你想要的数据进行处理就可以了。但是在使用的时候也是有不同的。List和Set都有iterator()来取得其迭代器。对List来说,你也可以通过listIterator()取得其迭代器,两种迭代器在有些时候是不能通用的,Iterator和ListIterator主要区别在以下方面:
(1)ListIterator有add()方法,可以向List中添加对象,而Iterator不能
(2)ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
(3)ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
(4)都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。
3. 多线程
35. 并行和并发有什么区别?
36. 线程和进程的区别?
37. 守护线程是什么?
如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。
JVM 中的垃圾回收线程就是典型的守护线程,如果说不具备该特性,会发生什么呢?
当 JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴尬了!!!由此可见,守护线程的重要性了。
通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说 JVM 退出时,线程能够自动关闭,此时,守护线程是你的首选。
38. 创建线程有哪几种方式?
1.继承Thread类
2.实现runnable接口
3.实现callable接口
4.利用线程池创建。
39. 说一下 runnable 和 callable 有什么区别?
不同点:
-
1)Runnable提供run方法,无法通过throws抛出异常,所有CheckedException必须在run方法内部处理。Callable提供call方法,直接抛出Exception异常。2)Runnable的run方法无返回值,Callable的call方法提供返回值用来表示任务运行的结果3)Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行。而Callable只能通过线程池执行
40. 线程有哪些状态?
1. 新建(NEW):新创建了一个线程对象。
2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
4. 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:
(一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
5. 死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
41. sleep() 和 wait() 有什么区别?
42. notify()和 notifyAll()有什么区别?
1、这两个方法来自不同的类分别是Thread和Object,sleep方法属于Thread类中的静态方法,wait属于Object的成员方法。
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)。
notify随机唤醒一个,notifyAll唤醒所有在等待池中的线程去竞争锁。
43. 线程的 run()和 start()有什么区别?
线程通过start方法开启一个线程,线程进入runnable状态,主线程继续往下走,线程如被CPU调度会调用run方法真正开始运行。
run方法只是runnable下面的一个普通方法,直接调用跟其他方法无异。
44.创建线程池有哪几种方式?
newSingleThreadExecutor
创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
newFixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
newCachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
45.线程池都有哪些状态?
https://blog.csdn.net/shahuhubao/article/details/80311992
46. 线程池中 submit()和 execute()方法有什么区别?
submit()有返回Future, execute()没有返回值。
47. 在 java 程序中怎么保证多线程的运行安全?
1.原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
2.可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);
3.有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。
48. 多线程锁的升级原理是什么?
49. 什么是死锁?
当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。
当然死锁的产生是必须要满足一些特定条件的:
1.互斥条件:进程对于所分配到的资源具有排它性,即一个资源只能被一个进程占用,直到被该进程释放
2.请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放。
3.不剥夺条件:任何一个资源在没被该进程释放之前,任何其他进程都无法对他剥夺占用
4.循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞。
50. 怎么防止死锁?
- 破坏“不可剥夺”条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。
- 破坏”请求与保持条件“:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。
- 破坏“循环等待”条件:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
51. ThreadLocal 是什么?有哪些使用场景?
https://www.cnblogs.com/coshaho/p/5127135.html
52. 说一下 synchronized 底层实现原理?
53. synchronized 和 volatile 的区别是什么?
54. synchronized 和 Lock 有什么区别?
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可中断、可公平(两者皆可)
6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
55. synchronized 和 ReentrantLock 区别是什么?
https://blog.csdn.net/zxd8080666/article/details/83214089
56. 说一下 atomic 的原理?
4. 反射
57. 什么是反射?
58. 什么是 java 序列化?什么情况下需要序列化?
59. 动态代理是什么?有哪些应用?
60. 怎么实现动态代理?
JDK方式和CGlib方式
JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
5. 对象拷贝
61. 为什么要使用克隆?
62. 如何实现对象克隆?
63. 深拷贝和浅拷贝区别是什么?
如果要对某个类的的实例的引用类型属性实现深克隆,要求引用类型属性对于的类实现Cloneable接口并重写clone()。
6. Java Web
64. jsp 和 servlet 有什么区别?
65. jsp 有哪些内置对象?作用分别是什么?
66. 说一下 jsp 的 4 种作用域?
67. session 和 cookie 有什么区别?
68. 说一下 session 的工作原理?
69. 如果客户端禁止 cookie 能实现 session 还能用吗?
70. spring mvc 和 struts 的区别是什么?
71. 如何避免 sql 注入?
72. 什么是 XSS 攻击,如何避免?
73. 什么是 CSRF 攻击,如何避免?
7. 异常
74. throw 和 throws 的区别?
75. final、finally、finalize 有什么区别?
76. try-catch-finally 中哪个部分可以省略?
77. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
78. 常见的异常类有哪些?
8. 网络
79. http 响应码 301 和 302 代表的是什么?有什么区别?
301 Moved Permanently
302 Move Temporarily
80. forward 和 redirect 的区别?
81. 简述 tcp 和 udp的区别?
82. tcp 为什么要三次握手,两次不行吗?为什么?
83. 说一下 tcp 粘包是怎么产生的?
84. OSI 的七层模型都有哪些?
85. get 和 post 请求有哪些区别?
86. 如何实现跨域?
87. 说一下 JSONP 实现原理?
9. 设计模式
88. 说一下你熟悉的设计模式?
89. 简单工厂和抽象工厂有什么区别?
10. Spring/Spring MVC
90. 为什么要使用 spring?
91. 解释一下什么是 aop?
92. 解释一下什么是 ioc?
93. spring 有哪些主要模块?
94. spring 常用的注入方式有哪些?
95. spring 中的 bean 是线程安全的吗?
96. spring 支持几种 bean 的作用域?
97. spring 自动装配 bean 有哪些方式?
98. spring 事务实现方式有哪些?
99. 说一下 spring 的事务隔离?
100. 说一下 spring mvc 运行流程?
101. spring mvc 有哪些组件?
102. @RequestMapping 的作用是什么?
103. @Autowired 的作用是什么?
11. Spring Boot/Spring Cloud
104. 什么是 spring boot?
105. 为什么要用 spring boot?
106. spring boot 核心配置文件是什么?
107. spring boot 配置文件有哪几种类型?它们有什么区别?
108. spring boot 有哪些方式可以实现热部署?
109. jpa 和 hibernate 有什么区别?
110. 什么是 spring cloud?
111. spring cloud 断路器的作用是什么?
112. spring cloud 的核心组件有哪些?
12. Hibernate
113. 为什么要使用 hibernate?
114. 什么是 ORM 框架?
115. hibernate 中如何在控制台查看打印的 sql 语句?
116. hibernate 有几种查询方式?
117. hibernate 实体类可以被定义为 final 吗?
118. 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
119. hibernate 是如何工作的?
120. get()和 load()的区别?
121. 说一下 hibernate 的缓存机制?
122. hibernate 对象有哪些状态?
123. 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
124. hibernate 实体类必须要有无参构造函数吗?为什么?
13. Mybatis
125. mybatis 中 #{}和 ${}的区别是什么?
126. mybatis 有几种分页方式?
127. RowBounds 是一次性查询全部结果吗?为什么?
128. mybatis 逻辑分页和物理分页的区别是什么?
129. mybatis 是否支持延迟加载?延迟加载的原理是什么?
130. 说一下 mybatis 的一级缓存和二级缓存?
131. mybatis 和 hibernate 的区别有哪些?
132. mybatis 有哪些执行器(Executor)?
133. mybatis 分页插件的实现原理是什么?
134. mybatis 如何编写一个自定义插件?
14. RabbitMQ
135. rabbitmq 的使用场景有哪些?
136. rabbitmq 有哪些重要的角色?
137. rabbitmq 有哪些重要的组件?
138. rabbitmq 中 vhost 的作用是什么?
139. rabbitmq 的消息是怎么发送的?
140. rabbitmq 怎么保证消息的稳定性?
141.rabbitmq 怎么避免消息丢失?
142. 要保证消息持久化成功的条件有哪些?
143. rabbitmq 持久化有什么缺点?
144. rabbitmq 有几种广播类型?
145. rabbitmq 怎么实现延迟消息队列?
146. rabbitmq 集群有什么用?
147. rabbitmq 节点的类型有哪些?
148. rabbitmq 集群搭建需要注意哪些问题?
149. rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?
150. rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?
151. rabbitmq 对集群节点停止顺序有要求吗?
15. Kafka
152. kafka 可以脱离 zookeeper 单独使用吗?为什么?
153. kafka 有几种数据保留的策略?
154. kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?
155. 什么情况会导致 kafka 运行变慢?
156. 使用 kafka 集群需要注意什么?
16. Zookeeper
157. zookeeper 是什么?
158. zookeeper 都有哪些功能?
159. zookeeper 有几种部署模式?
160. zookeeper 怎么保证主从节点的状态同步?
161. 集群中为什么要有主节点?
162. 集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?
163. 说一下 zookeeper 的通知机制?
17. MySql
164. 数据库的三范式是什么?
165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
166. 如何获取当前数据库版本?
167. 说一下 ACID 是什么?
168. char 和 varchar 的区别是什么?
169. float 和 double 的区别是什么?
170. mysql 的内连接、左连接、右连接有什么区别?
171. mysql 索引是怎么实现的?
172. 怎么验证 mysql 的索引是否满足需求?
173. 说一下数据库的事务隔离?
174. 说一下 mysql 常用的引擎?
innoDB, MyISAM
175. 说一下 mysql 的行锁和表锁?
176. 说一下乐观锁和悲观锁?
177. mysql 问题排查都有哪些手段?
178. 如何做 mysql 的性能优化?
18. Redis
179. redis 是什么?都有哪些使用场景?
180. redis 有哪些功能?
181. redis 和 memecache 有什么区别?
182. redis 为什么是单线程的?
183. 什么是缓存穿透?怎么解决?
184. redis 支持的数据类型有哪些?
185. redis 支持的 java 客户端都有哪些?
186. jedis 和 redisson 有哪些区别?
187. 怎么保证缓存和数据库数据的一致性?
188. redis 持久化有几种方式?
189.redis 怎么实现分布式锁?
190. redis 分布式锁有什么缺陷?
191. redis 如何做内存优化?
192. redis 淘汰策略有哪些?
193. redis 常见的性能问题有哪些?该如何解决?
19. JVM
194. 说一下 jvm 的主要组成部分?及其作用?
195. 说一下 jvm 运行时数据区?
196. 说一下堆栈的区别?
197. 队列和栈是什么?有什么区别?
198. 什么是双亲委派模型?
首先会检查请求加载的类是否已经被加载过;
若没有被加载过:
递归调用父类加载器的loadClass();
父类加载器为空后就使用启动类加载器加载;
如果父类加载器和启动类加载器均无法加载请求,则调用自身的加载功能。
199. 说一下类加载的执行过程?
1. 加载
加载,是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建java.lang.Class对象的过程。这个过程,将类的.class文件中的二进制数据读入内存,放在运行时区域的方法区内。然后在堆中创建java.lang.Class对象,用来封装类在方法区的数据结构。
类加载阶段:
(1)Java虚拟机将.class文件读入内存,并为之创建一个Class对象。
(2)任何类被使用时系统都会为其创建一个且仅有一个Class对象。
(3)这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些构造方法,都有哪些成员方法,都有哪些成员变量等。
Student类加载过程图示:
2. 链接
链接包括验证、准备以及解析三个阶段。
(1)验证阶段。主要的目的是确保被加载的类(.class文件的字节流)满足Java虚拟机规范,不会造成安全错误。
(2)准备阶段。负责为类的静态成员分配内存,并设置默认初始值。
(3)解析阶段。将类的二进制数据中的符号引用替换为直接引用。
说明:
符号引用。即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。
直接引用。可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的指针;而实例方法,实例变量的直接引用则是从实例的头指针开始算起到这个实例变量位置的偏移量。
举个例子来说,现在调用方法hello(),这个方法的地址是0xaabbccdd,那么hello就是符号引用,0xaabbccdd就是直接引用。
在解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用。
3. 初始化
初始化,则是为标记为常量值的字段赋值的过程。换句话说,只对static修饰的变量或语句块进行初始化。
如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
https://www.cnblogs.com/luohanguo/p/9469851.html
200. 怎么判断对象是否可以被回收?
引用计数法
引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种方法的缺点就是不能检测到环的存在。
首先需要声明,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存。
什么是引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1.任何时刻计数器值为0的对象就是不可能再被使用的。那为什么主流的Java虚拟机里面都没有选用这种算法呢?其中最主要的原因是它很难解决对象之间相互循环引用的问题。
根搜索算法:
根搜索算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
这个算法的基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。
那么问题又来了,如何选取GCRoots对象呢?在Java语言中,可以作为GCRoots的对象包括下面几种:
(1). 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
(2). 方法区中的类静态属性引用的对象。
(3). 方法区中常量引用的对象。
(4). 本地方法栈中JNI(Native方法)引用的对象。
201. java 中都有哪些引用类型?
四种引用类型:强引用,软引用,弱引用,虚引用。
202. 说一下 jvm 有哪些垃圾回收算法?
标记-清除算法(Mark-Sweep)
复制算法(Copying)
标记-整理算法(Mark-compact)
分代收集算法
203. 说一下 jvm 有哪些垃圾回收器?
- Serial收集器(复制算法)
新生代单线程收集器,标记和清理都是单线程,优点是简单高效。是client级别默认的GC方式,可以通过-XX:+UseSerialGC
来强制指定。 - Serial Old收集器(标记-整理算法)
老年代单线程收集器,Serial收集器的老年代版本。 - ParNew收集器(停止-复制算法)
新生代收集器,可以认为是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现。 - Parallel Scavenge收集器(停止-复制算法)
并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般为99%, 吞吐量= 用户线程时间/(用户线程时间+GC线程时间)。适合后台应用等对交互相应要求不高的场景。是server级别默认采用的GC方式,可用-XX:+UseParallelGC
来强制指定,用-XX:ParallelGCThreads=4
来指定线程数。 - Parallel Old收集器(停止-复制算法)
Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先。 - CMS(Concurrent Mark Sweep)收集器(标记-清理算法)
高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择。
204. 详细介绍一下 CMS 垃圾回收器?
205. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
206. 简述分代垃圾回收器是怎么工作的?
207. 说一下 jvm 调优的工具?
208. 常用的 jvm 调优的参数都有哪些?