一、JVM Optimization
1、进程溢出调查
模拟
如何开启GC日志
如何开启GC日志
一般来说,JDK8及以下版本通过以下参数来开启GC日志:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
如果是在JDK9及以上的版本,则格式略有不同:
-# JDK 11 环境,输出 info 级别的 GC 日志
java -Xms4g -Xmx4g
-Xlog:gc*=info:file=gc.log:time:filecount=0
串行垃圾收集、并行垃圾收集、并发垃圾回收、增量式垃圾回收
串行:就是只有单个worker线程来执行GC工作。
并行:并行垃圾收集,是指使用多个GC worker 线程并行地执行垃圾收集,能充分利用多核CPU的能力,缩短垃圾收集的暂停时间。除了单线程的GC,其他的垃圾收集器,比如 PS,CMS, G1等新的垃圾收集器都使用了多个线程来并行执行GC工作。
并发:并发垃圾收集器,是指在应用程序在正常执行时,有一部分GC任务,由GC线程在应用线程一起并发执行。例如 CMS/G1的各种并发阶段。
增量:首先, G1的堆内存不再单纯划分为年轻代和老年代,而是划分为多个(通常是 2048个)可以存放对象的小块堆区域(smaller heap regions)。每个小块,可能一会被定义成 Eden 区,一会被指定为 Survivor 区或者 Old 区。这样划分之后,使得 G1 不必每次都去回收整个堆空间,而是以增量的方式来进行处理: 每次只处理一部分内存块,称为此次 GC 的回收集(collection set)。下一次GC时在本次的基础上,再选定一定的区域来进行回收。增量式垃圾收集的好处是大大降低了单次GC暂停的时间。
GC停顿
因为GC过程中,有一部分操作需要等所有应用线程都到达安全点,暂停之后才能执行,这时候就叫做GC停顿,或者叫做GC暂停。
JVM设置元空间大小
在Java虚拟机(JVM)中,元空间(Metaspace)是用于存储类元数据、常量池等的区域,它与之前的永久代(PermGen space)不同,元空间使用的是本地内存(native memory),而不是JVM堆内存。从Java 8开始,默认的元空间大小是依赖于操作系统的,但在某些情况下,你可能需要手动设置元空间的大小以避免内存溢出错误。
如何设置元空间大小
1. 使用JVM启动参数
你可以在启动Java应用程序时通过JVM参数来设置元空间的大小。使用-XX:MetaspaceSize来设置元空间的初始大小,使用-XX:MaxMetaspaceSize来设置元空间的最大大小。例如:
java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -jar your-application.jar
这里,-XX:MetaspaceSize=128m设置了元空间的初始大小为128MB,-XX:MaxMetaspaceSize=256m设置了元空间的最大大小为256MB。
2. 动态调整
在某些情况下,你可能想在运行时动态调整元空间的大小。虽然JVM不直接支持动态调整元空间的大小,但你可以通过重启应用程序来改变这些设置。
初始大小和最大大小:通常建议将初始大小设置为一个相对较小的值,然后通过监控应用程序的行为来调整最大大小。这样可以减少启动时的内存占用,同时也留有足够的空间应对未来的需求。
监控:在生产环境中,监控元空间的使用情况是很重要的。你可以使用诸如JConsole、VisualVM或第三方工具如JMX来监控内存使用情况。
自动增长:从Java 8开始,如果不设置最大值,元空间的大小是可以自动增长的。但是,为了避免耗尽系统内存,最好还是设定一个合理的最大值。
如果你不确定如何开始,可以先设置一个较小的初始大小和最大大小,例如:
java -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -jar your-application.jar
然后根据应用程序的运行情况逐步调整这些值。如果你发现应用程序频繁地进行垃圾回收或者出现OutOfMemoryError错误,可能需要增加元空间的大小。
正确设置元空间的大小对于确保Java应用程序的稳定运行至关重要。通过合理配置初始大小和最大大小,可以平衡应用程序的内存需求和系统的整体性能。
JVM Optimization Learning(六)-ZGC
再小的努力,乘以365都很明显!
每天⽤⼼记录⼀点点。内容也许不重要,但习惯很重要!
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!