摘要:class Student系列,希望通过对一段非常简单的代码分析,以问题为导向,加深自己对代码的理解。
如题,一段非常简单的代码如下:
class Student {
int age;
String name;
static Student demo() {
Student xm = new Student();
xm.age += 10;
xm.name = "小ming😊";
return xm;
}
public static void main(String[] args) {
Student.demo();
}
本系列会尝试回答以下问题:
1) 基本内存分配分析
- 执行demo方法时,哪些地方分配了哪些内存?分别是多大?
- 字符串占用多少内存?编码方式?引用占用多大内存?
- 方法栈上的内存布局是什么样的?堆上的内存布局?
2)执行
- 栈式虚拟机是如何执行这段代码的?字节码?寄存器式虚拟机?
- 栈式虚拟机 和 寄存器式虚拟机区别?
3) 操作系统
- 虚拟内存上的对局是什么样的?
- 物理内存上的布局是什么样的?
- 上述代码是如何体现局部性原理的?
- 哪些进程和线程参与到了demo执行中?进程消耗了哪些资源,线程?COW?Task?
- 虚拟内存,文件系统怎么参与到demo方法的运行中?
- 哪些硬件参与到了代码执行中?硬件上的数据流动是什么样的?
4)GC
- demo方法执行完成后,哪些内存可以回收?回收时机?
- demo方法执行过程中,哪些内存不可以回收,为什么?
- demo方法如果执行100w次,适合什么样的内存回收机制?对比分析?
- 如果执行demo方法时内存不够了,OOM会崩溃在哪一行?为什么?
- 想办法让demo方法内存泄漏
- OOM 和 内存泄漏的区别?OOM的原因?OOM一定是内存不够了吗?
- GC影响了什么?
- 分代GC为啥有效?
5)多线程和内存模型
- 线程私有的,线程共享的?
- 两个线程同时执行的内存布局情况?
- 执行demo方法时,线程CPU被抢占,发生了什么?
- 是否是线程安全的?为什么?
- 上述代码中哪些操作是原子性的,哪些操作不是?
- 如果给demo方法加上
synchronzed
关键字,会有什么变化? - 10000个线程同时执行demo方法?100w个线程同时执行?
- 线程的开销有哪些?
- 线程安全:系统的保证在什么程度?intra-thread 语义
- 哪些分配在主内存,哪些分配在工作内存?
- 原子操作有哪些?
- 缓存一致性模型?
- 上述代码存在哪些happens-before 关系?