内存泄漏:内存被申请后始终无法释放,导致内存无法被回收使用,造成内存空间浪费
内存溢出:指内存申请时,内存空间不足
1.内存上限过小
2.内存加载数据太多
3.分配太多内存没有回收,出现内存泄漏
内存逃逸:是指程序运行时的数据,本应在栈上分配,但需要在堆上分配,称为内存逃逸
Java 中的对象都是在堆上分配的,而垃圾回收机制会回收堆中不再使用的对象,但是筛选可回收对象,回收对象还有整理内存都需要消耗时间。如果能够通过逃逸分析确定对象不会逃出方法之外,那就可以让这个对象在栈上分配内存,对象所占用的内存就可以随栈帧出栈而销毁,就减轻了垃圾回收的压力
线程同步本身比较耗时,如果确定一个变量不会逃逸出线程,无法被其它线程访问到,那这个变量的读写就不会存在竞争,对这个变量的同步措施可以清除
Java 虚拟机中的原始数据类型 (int,long 及 reference 类型等) 都不能再进一步分解,它们称为标量。如果一个数据可以继续分解,那它称为聚合量,Java 中最典型的聚合量是对象。如果逃逸分析证明一个对象不会被外部访问,并且这个对象是可分解的,那程序运行时可能不创建该对象,而改为直接创建它的若干个被方法使用到的成员变量来代替。拆散后的变量便可以被单独分析与优化,可以各自分别在栈帧或寄存器上分配空间,原本的对象就无需整体分配空间