
对齐填充:为了保证对象的大小为8字节的整数倍,自动对齐,避免多次加载
jdk/bin/jvisualvm.exe的工具,也可cmd窗口直接输jvisualvm。打开以后在工具-插件安装Visual GC,监控一下当前已启动的java服务
从图中可以分为Metaspace元数据(非堆)、Old区老年代、Eden(Survivor0、Survivor1)区新生代也简称Young区
因为新生代绝大多数对象生命周期比较短,经过回收会导致Young区空间不连续,造成空间碎片的问题。

当给需要多个内存格的对象进行分配时无法分配,则会造成GC回收导致和CPU抢时间片。
于是将Young区在分成Eden区和Survivor区

始终会保证S0或者S1有一个为空
包含了Eden、S区,最小的GC有称为Minor GC
Major GC,通常会伴随着Minor GC,相当于Full GC
Young GC+ Old GC (+MateSpace GC)
会导致 stop the work , 要尽可能减少Full GC的频率
允许一定范围的Young GC
List<User> str = new ArrayList<>();
@GetMapping("/while")
public void while1() {
while (true){
str.add(new User());
}
}
-Xms40M -Xmx40M

Java8使用Metaspace来替代永久代。Metaspace是方法区在Hotspot中的实现,并不在虚拟机内存中而是直接使用本地内存。
在Java8中,Class、Metadata被存储在Metaspace元数据中,永久代(Java8后被Metaspace取代)存放了一下信息:
1.虚拟机加载的类信息
2.常量池
3.静态变量
4.即时编译后的代码
如要模拟Metaspace空间溢出,可以不断的生成代理类往元空间加,那么久会触发Metaspace OOM
public class MetaspaceTest {
static class User {
String name;
}
public static void main(String[] args) {
int i = 0;
try {
while (true) {
i++;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(User.class);
enhancer.setUseCache(false);
enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> methodProxy.invokeSuper(o, args));
enhancer.create();
}
} catch (Throwable e) {
System.out.println("i=" + i);
e.printStackTrace();
}
}
}

1.标记清除算法(存活对象、标记对象、未被使用空间)
2.标记复制算法
2.标记整理算法
对上述算法的应用,将不同的回收算法适用于不同的代
新生代:标记复制算法,老年代:标记清除、整理算法
-XX:+UseSerialGC
-XX:+UseParallerlGC
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
-XX:+UseZGC
基于业务来确定使用最合理的垃圾回收期,主要有以下几个纬度
服务接口的响应时间,垃圾收集器进行垃圾回收和Client执行响应的时间
时间段内完成的请求数或者更新数,运行用户代码时间 /运行用户代码和垃圾收集总时间
以上就是本章的全部内容了。
上一篇:JVM第一话 – JVM入门详解以及运行时数据区分析
下一篇:JVM第三话 – JVM性能调优实战和高频面试题记录
书山有路勤为径,学海无涯苦作舟