- java内存区域概表
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/95ea33f21dff0c4cea12f47e2e2b2046.png)
String str = "abc";
final String str = "abc";
static String str = "abc";
- java内存区域细分表
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a89dd31177f9c369c935ea50c2ff5e42.png)
- 关于并不是所有对象都在堆内存中分配的说明(参考https://cloud.tencent.com/developer/article/1408121)
- 对象逃逸
1.方法逃逸:方法内创建对象作为返回值被其他方法使用
2.线程逃逸:赋值给类变量或可以被其他线程访问到的实例变量 - JIT的逃逸分析优化
- 同步省略:如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的操作可以不考虑同步。
- 将堆分配转化为栈分配:如果一个对象在子程序中被分配,要使指向该对象的指针永远不会逃逸,对象可能是栈分配的候选,而不是堆分配。比如一个方法内部创建的对象仅被该方法使用,并且不会作为返回值返回
- 分离对象或标量替换:有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中
- 关于OutOfMemoryError异常细分
- 堆溢出
java.lang.OutOfMemoryError: Java heap space
- 内存溢出:实际需要的内存空间比申请的内存空间大,比如申请了一个Integer,但实际存了Long内存空间才能存下的数,
- 内存泄漏:申请对象内存空间时,jvm没有足够的内存被分配或没有足够连续的内存供分配(涉及参数 -Xmx 和 -Xms)
- 方法区和运行时常量池溢出
java.lang.OutOfMemoryError: PermGen space
- 涉及参数 -XX:PermSize 和 -XX:MaxPermSize