JVM运行时数据区-堆
核心概念:
- 可以处于物理上不连续的内存空间,只需逻辑上连续即可。
- 一个JVM进程中堆是唯一的,一个进程有多个线程,所以堆是可以被一个JVM进程中的多个线程共享,也就是说堆是线程不安全的。
- 也就是堆内存是被线程共享的,但其中一小块区域TLAB(私有缓存区)是线程私有的,我在后面详细学习哈。
- 在JVM启动的时候被创建,其大小也就被确定了。
- 可以通过**-Xmx和-Xms**来控制其最大内存和最小内存
- 如果堆中内存没有完成实例分配且堆无法再继续扩展,则会抛出OutOfMemory的异常(OOM)。
- 对象实例、数组都在对上完成分配
- 不是全部对象,有一部分对象会发生逃逸,很深很深的概念,画圈圈后期深入学习。逃逸分析
- GC垃圾回收重点关照区域。
- 堆的构成:
- JDK1.8之前新生代-老年代
- 新生代又分为:Eden区和Survivor区
- Survivor区分为:Survivor From和Survivor TO(或者s0、s1)
- 新生代又分为:Eden区和Survivor区
- JDK1.8之前新生代-老年代
- 频繁的对象创建和回收->性能瓶颈?优化:逃逸分析
- 减少临时对象在堆内分配的数量。
后续补充
- 优点:与栈相比,可以动态的分配内存,生命周期也不需要明确,但分配灵活,也造成了其访问速度较慢的缺点。