主旨:避免full cg
减少FUll CG:
老年代采用并发收集器 ----
设置-Xms -Xmx一样,避免堆伸缩导致的full cg。
加大新生代体积,让对象停留在新生代
通过 -XX:MaxTenuringThreshold 调大对象进入老年代的年龄,让对象停留在新生代
提高MetaspaceSize,因为MetaspaceSize过小会触发full gc
使用MaxTenuringThreshold设置在新生代存货多少次才进入老年区
设置-XX:MaxMetaspaceSize调整元数据控件,避免占用其他软件的内存使用。
survivor占用率100%的问题:
利用-XX:SurvivorRatio参数设置survivor区的大小
Survivor区占用量超过50% 会将多余值放到老年区:
通过TargetSurvivorRatio:80%设置 当占用量超过80%的时候才进入老年区
大对象:
jmap -histo:live 20954:查看存活的对象的具体情况,找出占用大内存的对象,大内存会导致gc
如何大内存对象找出具体代码位置?通过MAT分析故障
内存泄漏:
内存泄漏的原因://www.greatytc.com/p/54b5da7c6816
jvm监控:jvisualvm
输出dump:使用jconsole
使用jmap分析内存中对象和生成dump
tomcat调优
https://juejin.cn/post/6844903586111963144
异步io
同步io在处理请求的时候,由于io的处理需要时间,所以处理该请求的进程被迫阻塞自己来等待io处理,linux系统对于如果进程主动阻塞自己则直接剥夺cpu使用权,于是当另外一个请求过来的时候,linux系统会重新分配一个进程给他。当上一个进程的io处理好后,cpu需要切换到上一个进程去处理。试想,如果有几百个请求,那么就需要创建几百个进程,同时因为io的处理以及处理好,cpu需要不断的在这些进程之间切换,cpu进程切换本身需要时间,当在几百个进程之间切换的时候会放大这种时间问题。
异步io解决的问题就是cpu进程切换导致的时间浪费问题,解决的思路就是一个进程可以处理几百个连接,解决的办法就是非阻塞io,非阻塞io是指当遇到uo处理的时候,系统会把当前socket的对应的回调函数处理给保存到一个红黑树上,而进程现在就可以去做别的事情了(处理其他请求),会有另外一个进程专门处理io完毕问题,一旦有io处理完毕,这个进程就从红黑树上找到对应的socket.毁回调函数,并处理。
