笔者网站,本来搭载乞丐版云服务器,1cpu,1g内存,结果安装了ceots8发现可用物理内存只有800m。


tomcat占用256m内存,虚拟机经常就自动退出挂了。观察启动tomcat进程后,younggc十分频繁,大概两秒钟一次。

[root@ ~]# jstat -gcutil -h10 【tomcat-pid号】 10000 10000

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   

  0.00   3.75  18.38   4.22  98.06  95.64  10009    60.429   0    0.000    0.429

短短几分钟内,younggc时间总时长超过一分钟,次数上万次,「这没有什么可吹嘘的,但是可以留个小坑排查~」


用jmap -heap pid号,发现edian区比较小,新生代所占比例较小,80m左右,永生带制定了90m,其实新生代与老生代各占一半比较妥帖。jdk1.8中的meta区取代了永生带的概念,这个是包含在老生代的大小中的。


另外打印人性化的日志时间有利于排查崩溃时的“犯罪现场”。-XX:PrintGCTimeStamps这个人根本看不懂的时间戳不要用。

-XX:+PrintGCDetails -XX:+PrintGCDateStamps  -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution


-Xloggc:/root/gc.log

留下gc日志有利于日后排查。

-XX:HeapDumpPath=/root/oom.dump

留下内存溢出日志,有利于堆得排查。

 -XX:+HeapDumpOnOutOfMemoryError  -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC


NewRatio                 = 2

SurvivorRatio            = 8

这是默认的大小比率。


另外垃圾回收期指定用的CMS回收器。目前效果还可以,cms回收器是专门回收old区的,也就是old+metaspace两个区,512m足够了。g1回收器是复制清除,所以内存碎片较少,但是对内存要求也高,需要可以划分整块的,cms则易形成碎片,在并发表及是会stop the world。


贴一个乞丐版服务器的内存分布,但是jdk1.8用的是tomcat7,但是用的tomcat9的话对新生代的内存要求就很大,如果800m内存可能就不够了。

Attaching to process ID 3671, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.152-b16


using parallel threads in the new generation.

using thread-local object allocation.

Concurrent Mark-Sweep GC


Heap Configuration:

   MinHeapFreeRatio         = 40

   MaxHeapFreeRatio         = 70

   MaxHeapSize              = 536870912 (512.0MB)

   NewSize                  = 87228416 (83.1875MB)

   MaxNewSize               = 87228416 (83.1875MB)

   OldSize                  = 46989312 (44.8125MB)

   NewRatio                 = 2

   SurvivorRatio            = 8

   MetaspaceSize            = 50331648 (48.0MB)

   CompressedClassSpaceSize = 1073741824 (1024.0MB)

   MaxMetaspaceSize         = 100663296 (96.0MB)

   G1HeapRegionSize         = 0 (0.0MB)


Heap Usage:

New Generation (Eden + 1 Survivor Space):

   capacity = 78512128 (74.875MB)

   used     = 25644384 (24.456390380859375MB)

   free     = 52867744 (50.418609619140625MB)

   32.66295877243322% used

Eden Space:

   capacity = 69795840 (66.5625MB)

   used     = 19872352 (18.951751708984375MB)

   free     = 49923488 (47.610748291015625MB)

   28.4721152435446% used

From Space:

   capacity = 8716288 (8.3125MB)

   used     = 5772032 (5.504638671875MB)

   free     = 2944256 (2.807861328125MB)

   66.22121710526316% used

To Space:

   capacity = 8716288 (8.3125MB)

   used     = 0 (0.0MB)

   free     = 8716288 (8.3125MB)

   0.0% used

concurrent mark-sweep generation:

   capacity = 56889344 (54.25390625MB)

   used     = 30213704 (28.81403350830078MB)

   free     = 26675640 (25.43987274169922MB)

   53.10960168568651% used

买了台服务器内存1g的还够用,但是买的一台服务器,内存都不给足。

KiB Mem:   1026840 total

MiB Mem :   829.6 total,

阿里云明显克扣缩水。