1. java内存模型
线程私有
- 虚拟机栈:局部变量表、操作数栈、指向常量池的指针pc计数器:存放下一次操作地址本地方法栈:C帧,执行本地方法(C语言写的方法)
线程共享
- 堆:用来存创建对象用的方法区:类的数据
2. java执行器
类加载器把字节码加入到jvm,类装载子系统就会对字节码进行,验证、准备、识别,如果正确之后就初始化(静态变量与原来的值被指配与静态块被执行)
3. GC垃圾回收
jvm垃圾回收是按分代回收,
新生代:老年代 = 1 : 2
新生代的话又分 = Eden : survivor to : survivor = 8:1:1
新生代: 存活率低,复制算法,对半分浪费空间,在细分,浪费1/10
老年代:存活率高,采取标记整理法回收。 jdk1.8移除了永久代,采用元空间,直接内存,原因永久代分配内存问题,太大浪费,太小OOM。
| 参数 | 描述 |
|---|---|
| -Xmn | 设置新生代堆空间 |
| -Xms | 设置最小堆空间 |
| -xmx | 设置最大堆空间 |
| -XX:metaspaceSize | 设置元空间 |
| -XX:MaxmetaspaceSize | 设置最大元空间 |
5.垃圾回收器
新生代收集器(复制算法):Serial、ParNew、Parallel Scavenge 老年代收集器:Serial Old(标记-整理)、CMS(标记-清除)、Par Old(标记-整理) 整堆收集器:G1(一个Region: 标记-清除,Region之间:复制算法)
- Serial: 单线程,高效(与其他收集器的单线程相比),Stop The World。Serial Old:单线程,标记-整理,JDK1.5 与 Parllel ScavengeCMS:最短回收停顿时间为目标的收集器,基于标记-清除算法,并发收集、低停顿。Par New:是Serial的多线程版本,默认开启线程数与CPU相同,也可以通过-XX:ParallelGCThreads来限制垃圾回收的线程数;Parallel Scavenge: 与吞吐量密切相关,因此也称为吞吐量优先收集器,GC自适应调节策略(开关开启时,可以不用手动设置,新生代大小,Eden与survivor的比例,以及晋升老年代的年龄等,虚拟机会根据运行状况收集性能监控信息,动态设置这些参数,来提供最优的停顿时间和最高的吞吐量)。Parallel Old:是Parallel Scavenge的老年待版本,多线程,采用标记-整理算法。G1: 并行与并发,充分利用多cpu、多核环境下的硬件优势,来缩短Stop The World停顿时间,G1能够独立管理整个java堆,分代收集,内存分区,空间整合,可预测停顿。 (JDK1.8 内存为16G的情况下推荐使用G1回收器)
6. 说一下堆栈的区别?
物理地址
堆的物理地址分配对对象是不连续的。因此性能慢些 栈使用的是数据结构中的栈,先进后出的原则,物理地址分配是连续的。所以性能快。
存放内容
栈存放局部变量,操作数栈,返回结果 堆存放的是对象的实例和数组
可见性: 堆对于整个应用程序都是共享、可见的。 栈只对于线程是可见的。所以也是线程私有。他的生命周期和线程相同。



