1.图解对象分配过程
特殊情况
public class HeapInstanceTest {
byte[] buffer = new byte[new Random().nextInt(1024 * 200)];
public static void main(String[] args) {
ArrayList<HeapInstanceTest> list = new ArrayList<HeapInstanceTest>();
while (true) {
list.add(new HeapInstanceTest());
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2.Minor GC、Major GC、Full GC
-
部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:
-
新生代收集(Minor GC/Young GC):只是新生代的垃圾收集
-
老年代收集(Major GC/Old GC):只是老年代的垃圾收集
-
混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集
-
-
整堆收集(Full GC):收集整个java堆和方法区的垃圾收集
Full GC 是开发或调优中尽量要避免的,这样暂停时间会短一些
3.TLAB(线程私有缓存区域)
为什么有TLAB(Thread Local Allocation Buffer)
- 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据
- 由于对象实例的创建在JVM中非常频繁,淫才在并发环境下从堆区中划分内存空间是线程不安全的
- 为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度