线程池的作用是什么?
利用线程池管理并复用线程、控制最大并发数等。
实现任务线程队列缓存策略和拒绝机制。
实现某些与时间相关的功能,如定时执行、周期执行等。
隔离线程环境。比如,交易服务和搜索服务在同一台服务器上,分别开启两个线程池,交易线程的资源消耗明显要大;因此,通过配置独立的线程池,将较慢的交易服务与搜索服务隔开,避免个服务线程互相影响。
线程池的创建方式?
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
线程池的拒绝策略是什么样的?
有四种拒绝策略:
1、AbortPolicy策略
该策略直接抛出异常,阻止系统工作
2、CallerRunsPolicy策略
只要线程池未关闭,该策略直接在调用者线程中运行当前被丢弃的任务。显然这样不会真的丢弃任务,但是,调用者线程性能可能急剧下降。
3、DiscardOledestPolicy策略
丢弃最老的一个请求任务,也就是丢弃一个即将被执行的任务,并尝试再次提交当前任务。
4、DiscardPolicy策略
默默的丢弃无法处理的任务,不予任何处理。
5、还可以扩展一个RejectedExecutionHandler接口,自定义策略
shutdown与shutdownnow 区别?
shutDown后可以使用awaitTermination等待所有线程执行完毕当前任务。
shutDownNow就会迫使当前执行的所有任务停止工作。
JVM的组成有哪些?
运行时数据区
类加载器子系统
本地方法库
执行引擎
类加载的过程是怎样的?每一步的作用是什么?
加载过程包括加载、验证、准备、解析、初始化
加载阶段作用:通过类的全限定名来获取定义此类的二进制字节流,将此二进制字节流所代表的静态存储结构转化成方法区的运行时数据结构,在内存中生成代表此类的java.lang.Class对象,作为该类访问入口.
验证阶段的作用:确保Class文件的字节流中信息符合虚拟机的要求,不会危害虚拟机安全,使得虚拟机免受恶意代码的攻击.
准备阶段作用:为类变量分配内存并设置变量的初始值.
解析阶段作用:将类中的字符引用替换换位直接引用
初始化阶段作用:对类的静态变量,还有类的静态块进行初始化
什么是双亲委派机制?
双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,只有在父类加载器在自己的搜索范围内找不到指定类时,子类加载器才会尝试自己去加载。
运行时数据区有哪些组成?jdk1.7和jdk1.8有什么区别?
jdk1.7:
方法区 本地方法栈 虚拟方法栈 堆 程序计数器
此时方法区和堆还是属于一块连续的内存区域 字符串常量池 静态变量移动到了堆中
jdk1.8 方法区更名为元空间 并使用本地内存
堆的作用是什么?有哪些组成?
主要用来会后垃圾 由新生代和老年代组成
怎么判断对象失去引用?
应用计数法
程序给对象添加一个引用计数器,变量引用它时,计数器加1。当引用断开时,计数器减1。当计数器为0时,代表着没有任何变量引用它,该对象就是死亡状态,JVM需要对此类对象进行回收。
可达性分析法
程序创建一系列的GC Roots作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象与GC Roots没有任何引用链相连的话,即此对象到GC Roots不可达,则证明此对象是不可用的,JVM稍后将会对此类对象进行回收
垃圾回收算法有哪些?
标记清除算法
复制算法
标记整理算法
分代收集算法
垃圾回收时间有哪些?
安全点回收:运行中的线程执行完
安全区回收:一段连续的安全点
垃圾收集器G1是怎样的?
G1垃圾收集器是一种工作在堆内不同分区上的并发收集器。分区既可以归属于老年代,也可以归属新生代,同一个代的分区不需要保持连续。首先收集垃圾最多的分区。
常用的jvm优化工具有哪些?默认的堆得大小是多少?
jvm优化工具 JVisualvm 或者Jconsole
若没有在命令行中指定了初始化和最大的堆大小,则取决于计算机上的的物理内存大小