程序计数器:每个线程执行程序指令的行号
虚拟机栈:存放每个方法的栈帧,帧的入栈跟出栈就是方法执行的过程
本地方法栈:Native方法的栈
Java堆:保存Java对象的地方,细分为 Eden区, From Survivor空间, To Survivor空间(线程共享)
方法区:线程共享,存放已经被虚拟机加载进来的类信息,常量、静态变量,JIT编译后的数据代码。java的class文件首先进入的到方法区里面去。
方法区的一部分。
强引用:只要强引用还在,引用的对象永远不会被回收
软引用: 发生内存溢出之前会清除
弱引用:垃圾回收的时候会收走
虚引用:对象生命周期不会受到它影响,只是在被回收掉的时候,收到通知。
safePoint、安全区域 。(不操作内存的写,不跟主存打交道) STW(stop the world)
eden, survior中调用 Minor GC,之所以没有用STW,添加了统计老生代到 新生代数据引用的卡表(脏位)
新生代(eden + from + to)TLAB(Thread Local Allocation Buffers)由于to Survior的空间不够,找老年代做 内存担保 。
当经历过几次 从from 到 to过程后依旧活着的对象就可以进入到 老生代中去了。
Serial (单线程,新生代,copy算法)
Parallel New(多线程,新生代,copy算法,时间优先)
Parallel Scavenge(多线程,新生代,copy算法,吞吐量优先)
Serial Old(单线程,老生代, 标记清除)
Parallel Old(多线程,老生代, 标记清除)
CMS:垃圾收集器跟应用并行(多线程,老生代, 标记清除)分两次清理,第一次清理的时候,工作线程跟垃圾线程并行,第二次STW。(Java 9 被废除)
G1 (新生代 + 老生代)
热点方法,循环热点
C、C++属于静态编译,运行时候不会。java属于动态编译,虚方法动态分配,激进优化等使之更彻底,但是占用CPU。
优化方式:
内联优化(省去了方法的加载,压栈等。诡异的TR1图)
逃逸分析(对象没有被方法外引用的时候,直接到接近CPU的栈上分配存储空间。方法仅被一个线程调用到的时候,去掉同步锁。)
指令集(Compare And Sweep, Compare and Set),???
循环优化、向量优化