进程和线程
进程是操作系统分配资源的最小单位
线程是操作系统调度的最小单位
JVM JRE JDK
java虚拟机
识别class文件,解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。
JRE是java运行环境,JVM标准加上一大推基础类库。
JDK包含JRE,还提供了一些非常好用的工具。
JVM可以运行多种语言
JVM只识别字节码,只要语言服了字节码的规范,像scala
JVM有哪些内存区域
虚拟机栈:在JVM运行过程中存储当前线程运行方法所需的数据,指令,返回地址。
本地方法栈: 他服务的对象是native方法,也就是C,或者C++写的。
程序计数器: 主要用来记录各个线程执行的字节码的地址。
方法区:存放类的信息,常量池,方法数据,方法代码。
堆:堆是JVM上最大的内存区域,我们申请的几乎所有对象,都在堆中存储。
堆空间大小怎么配置?各区域如何区分
新生代:eden survivor 老年代 持久代
JVM 中有哪些会OOM
堆溢出: OutOfMemoryError
栈溢出:虚拟机栈,启动一个线程就会有,存储运行时数据指令和返回地址 (一般是递归用的不恰当)
方法区溢出: cglib
本地直接内存溢出
JVM在创建对象时采用了哪些并发安全机制
CAS 加失败重试。
1 本地线程分配缓冲,就是多线程把空间拆分开,这样他俩就弄不到一块了。
2 采用锁
什么是对象头?
怎么判断对象的存活
1 引用计数法
2 可达性分析计算
GCroots 就是看看 静态变量 线程栈变量 常量池 JNI(指针) 中有没有那些类,有的话就存活,没有就dead
什么是标记清除算法
GCroot根可达,没标记的话,就是垃圾,适合清除老年代。
标记整理算法
就是清除之后再整理一下,再清楚。
扩容新生代为何能提高GC的效率
CMS垃圾回收器
1 针对老年代
2 采用算法 标记清除法,采用concurrent(并发的) Mark Sweep
守护线程和用户线程的区别?
java中的线程分为两种: 守护线程和用户线程
守护线程通过调用Thread.setDaemon(true)设置。
一般程序使用的都是用户线程
守护线程一般不用,垃圾回收线程就是守护线程
使用守护线程的注意点
1 Thread.setDaemon()必须在Thread.start(true)之前调用
2 守护线程(daemon)是为了其他线程提供服务,如果全部的User Thread已经结束,守护线程没有可服务的线程,JVM关闭。
死锁
就是两个线程 都 需要对方的资源
Excutor和Excutors的区别
前者顶层接口 后者一个工具类