gc=full gc +young gc
Java jvm 内存=堆内存+非堆内存
堆内存(-Xms-Xmx)=年轻代(-Xmn)+年老代
-Xms,初始分配内存,-Xmx最大分配内存,一般情况下设置成一样的值
年轻代=Eden+s0+s1
非堆内存=持久代(-XX:PermSize -XX:MaxPermSize)+code cache(-XX:reservedcodecachesize)
-XX:PermSize(初始值大小)、-XX:MaxPermSize(最大值)
【jvm内存模型图】
gc:自动检测和释放不再使用的内存。(垃圾回收)
Minor gc:频率快是正常 ,也叫young gc
Major gc:尽可能让他频率少【重点关注】 ,也叫full gc
持久代(Perm):使用的class对象
Jvm的生命周期:①一个对象,首先放置在Eden区,结果发现需继续使用,不能进入gc回收,则会放置在s区,s0和s1随意。②如果放在s0区,过一段时间仍不能gc回收,则会放置在s1区③再过一段时间仍不能回收,则会存放在年老代区域。④在年老代存放很长时间后,可能被major gc回收,也可能继续存活
Jvm内存参数设置
-Xms-Xmx设置为一样的值,设置为可用内存的80%
-Xmn设置为堆内存的3/8
-XX:PermSize(默认为物理内存的1/64)、-XX:MaxPermSize(默认为物理内存的1/4)
Jvm公共参数配置
-server:服务器模式,一定要放在所有参数之前
-Xss:指定每个线程占的大小(建议不要超过1M)
-XX:SurvivorRatio:设置年轻代里面Eden区和s区的大小比值
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=path_address:JVM崩溃的时候会打印出heap dump
-XX:+AggressiveOpts:启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)
-Djava.awt.headless=true:一般放在最后,主要是解决图表不兼容
gc的类型
Serial GC:适用内存占用比较少的应用,性能最差
Parallel GC:年轻代多线程,年老代使用单线程
Parallel Old GC:年轻代和年老代都使用多线程收集垃圾
CMS:多线程并发回收垃圾,适用于不能忍受长时间停顿要求快速响应的应用,比较常用,最好和-XX:+UseParNewGC一同使用
-XX:+UseG1GC
gc相关参数
-XX: +DisableExplicitGC:禁止使用System.gc
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails –Xloggc:<filename>打印gc回收的详情日志
-XX:+UseGCOverheadLimit:让程序提前结束,达到预警目的
-XX:+UseCMSCompactAtFullCollection:对存活对象进行整理,使内存碎片减少
转载于:https://blog.51cto.com/8774676/1945190