1. JVM 永久代中会发生垃圾回收么(JDK 8 之前)?
答案:会。
永久代是 Hotspot 对 JVM 规范中方法区的实现,方法区用于存储类信息、常量池、静态变量、即时编译器编译后的代码等数据。虽然 Java 虚拟机规范中并没有要求虚拟机在方法区实现垃圾回收,但在 Hotspot 虚拟机中永久代是存在垃圾回收的。永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。回收废弃常量与回收Java堆中的对象非常类似。永久代的垃圾回收和老年代的垃圾回收是绑定的,一旦其中一个区域被占满,这两个区都要进行垃圾回收。
在 JDK 8 中,永久代被彻底移除,用一块与堆不相连叫做元空间的本地内存代替。那么元空间中会发生垃圾回收吗?答案也是会的。元空间使用的本地内存大小达到设定的 MaxMetaspaceSize
或者默认的MetaspaceSize
(12Mbytes on the 32bit client VM and 16Mbytes on the 32bit server VM with larger sizes on the 64bit VMs)值时,就会触发 GC 来回收失效的 classloader
和类信息。
2. 什么是准确式 GC?
即虚拟机可以知道内存某个位置的数据具体是什么,这样虚拟机才能在垃圾收集的时候准确判断堆上的数据是否还能被使用。
3. 可作为 GC Roots 的节点有哪些?
可作为 GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下(例如帧栈中的本地变量表)中。
4. Java 对象的回收时机
首先 JVM 的 GC 不是实时运行的,而是被触发的,具体的触发条件由 JVM 决定,一般当 JVM 的堆区内存不够时,GC 开始运行。
对象的回收条件:当对象没有被引用变量所引用时,对象就处于可以被 GC 回收的状态,当 GC 触发时,该对象就会被回收。
5. 什么是方法签名method signature
由方法名和参数类型组成,不包括返回类型。
举例:calculateAnswer(double, int, double, double)
6. 线程控制、线程同步和线程通讯
- 线程控制:
sleep()
,yield()
,join()
等 - 线程同步:
volatile
,synchronized
- 线程通信:
wait()
,notify()
7. 线程和进程的区别
The typical difference is that threads (of the same process) run in a shared memory space, while processes run in separate memory spaces.
8. 进程间通信的方式
-
Socket:
One option is to use sockets for interprocess communication. One program can act as the server program that listens on a socket connection for input from the client program. The client program connects to the server with a socket. Once the socket connection is established, either program can send or receive information. -
Stream files:
Another option is to use stream files for communication between programs. To do this, use theSystem.in
,System.out
, andSystem.err
classes. -
内存映射:
进程通过把一个共享的文件映射到自己的进程地址空间。 -
消息队列:
对消息队列有写权限的进程可以向消息队列中添加新的消息,对消息队列有读权限的进程可以从消息队列中读走新的消息。
9. HashMap, TreeMap 和 LinkedHashMap 的区别
- HashMap 中的元素不保持顺序
- TreeMap 中的元素根据 key 的值按升序排列
- LinkedHashMap 中的元素保持插入时的顺序
10. 什么是帧栈(Stack Frame)
每个线程运行的时候都会在虚拟机栈中开辟一个私有的虚拟机栈。当对象的方法调用的时候就会在虚拟机栈中创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成就对应着一个栈帧在虚拟机中入栈道出栈的过程。