1. gc=full gc +young gc

  1. Java jvm 内存=堆内存+非堆内存

  2. 堆内存(-Xms-Xmx=年轻代(-Xmn+年老代

-Xms,初始分配内存,-Xmx最大分配内存,一般情况下设置成一样的值

  1. 年轻代=Eden+s0+s1

  2. 非堆内存=持久代(-XXPermSize -XX:MaxPermSize+code cache(-XX:reservedcodecachesize)

-XX:PermSize(初始值大小)-XX:MaxPermSize(最大值)

jvm内存模型图】

  1. gc:自动检测和释放不再使用的内存。(垃圾回收)

  2. Minor gc:频率快是正常 ,也叫young  gc

  3. Major gc:尽可能让他频率少【重点关注】  ,也叫full gc

  4. 持久代(Perm):使用的class对象

  5. Jvm的生命周期:①一个对象,首先放置在Eden区,结果发现需继续使用,不能进入gc回收,则会放置在s区,s0s1随意。②如果放在s0区,过一段时间仍不能gc回收,则会放置在s1区③再过一段时间仍不能回收,则会存放在年老代区域。④在年老代存放很长时间后,可能被major gc回收,也可能继续存活

  6. Jvm内存参数设置

  • -Xms-Xmx设置为一样的值,设置为可用内存的80%

  • -Xmn设置为堆内存的3/8

  • -XX:PermSize(默认为物理内存的1/64)-XX:MaxPermSize(默认为物理内存的1/4)

  1. Jvm公共参数配置

  • -server:服务器模式,一定要放在所有参数之前

  • -Xss:指定每个线程占的大小(建议不要超过1M

  • -XX:SurvivorRatio:设置年轻代里面Eden区和s区的大小比值

  • -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=path_addressJVM崩溃的时候会打印出heap dump

  • -XX:+AggressiveOpts:启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)

  • -Djava.awt.headless=true:一般放在最后,主要是解决图表不兼容

  1. gc的类型

  • Serial GC:适用内存占用比较少的应用,性能最差

  • Parallel GC:年轻代多线程,年老代使用单线程

  • Parallel Old GC:年轻代和年老代都使用多线程收集垃圾

  • CMS:多线程并发回收垃圾,适用于不能忍受长时间停顿要求快速响应的应用,比较常用,最好和-XX:+UseParNewGC一同使用

  • -XX:+UseG1GC

  1. gc相关参数

  • -XX: +DisableExplicitGC:禁止使用System.gc

  • -XX:+PrintGCTimeStamps -XX:+PrintGCDetails Xloggc:<filename>打印gc回收的详情日志

  • -XX:+UseGCOverheadLimit:让程序提前结束,达到预警目的

  • -XX:+UseCMSCompactAtFullCollection:对存活对象进行整理,使内存碎片减少