服务器内存一共为4G
初始堆大小设置为1G
默认值:物理内存的1/64(<1GB)
空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.
最大堆大小设置为2G
物理内存的1/4(<1GB)
空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
每个线程的堆栈大小设置为256k
JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右,一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似一般设置这个值就可以了。
限制 JVM 使用的 直接内存 最大容量
ByteBuffer有两种:
heap ByteBuffer -> -XX:Xmx
1.一种是heap ByteBuffer,该类对象分配在JVM的堆内存里面,直接由Java虚拟机负责垃圾回收,
direct ByteBuffer -> -XX:MaxDirectMemorySize
2.一种是direct ByteBuffer是通过jni在虚拟机外内存中分配的。通过jmap无法查看该快内存的使用情况。只能通过top来看它的内存使用情况。
JVM堆内存大小可以通过-Xmx来设置,同样的direct ByteBuffer可以通过-XX:MaxDirectMemorySize来设置,此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后,即触发Full GC。注意该值是有上限的,默认是64M,最大为sun.misc.VM.maxDirectMemory(),在程序中中可以获得-XX:MaxDirectMemorySize的设置的值。
使用G1收集器 jdk11默认使用G1
特点:并行收集器(Parallel GC)可以压缩和回收old区的内存,但是只能对old区整体来操作。G1可以把整个工作增量的分散到多个时间更短的停顿中。这在减少停顿时间的同时会牺牲一部分吞吐量。
跟CMS类似,G1是并发的回收old区的内存,但是,CMS不会处理old区的碎片,最终就会导致长时间的FullGC。
由于并发的原因,G1可能会表现出比其他收集器更高的开销,这会影响吞吐量。
G1在任何的停顿都可以回收一些全空或者大量的old区的内存。这会避免不必要的GC,因为可以不费吹灰之力就可以释放大量的内存空间。
G1可以选择对整个堆里面的String进行并行去重。
JDK11新增
新的Epsilon垃圾收集器
ZGC
开启普通对象指针压缩 压缩对象Klass pointer 减少运行内存 减少gc耗时
类指针压缩 开启了-XX:+UseCompressedOops 会默认开启此项 效果同上
可能需要配置
分段代码缓存 选择按照分段初始化
当Code Cache不足之后会导致编译线程无法继续,并且消耗大量CPU,导致系统运行变慢。
用于垃圾收集时的信息打印
-XX:+PrintGC 与 -verbose:gc 是一样的,可以认为-verbose:gc 是 -XX:+PrintGC的别名.
-XX:+PrintGCDetails 在启动脚本可以自动开启
-XX:+PrintGC , 如果在命令行使用jinfo开启的话,不会自动开启-XX:+PrintGC
查看程序使用的默认jvm参数
打开此参数后,在做System.gc()时会做background模式CMS GC,即并行FULL GC,可提高FULL GC效率。注,该参数在允许systemGC且使用CMS GC时有效
日志打印
-Xlog:gc*=debug 指定debug级别日志打印
:file=指定路径
utctime 或者 utc UTC 时间
Level日志级别
Tags日志标签
output-options:filecount=50,filesize=100M这个表示保留 50 个文件,每个文件 100M
指定时区