一、简介:回收算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现
垃圾回收器分类:
1.Serial收集器:串行收集器是最古老、最稳定及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩;垃圾收集的过程中会服务暂停
参数控制:-XX:+UseSerialGC 串行收集器
2.ParNew收集器:Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩
参数控制:-XX:+UseParNewGC ParNew收集器
-XX: ParallelGCThreads 限制线程数量
3.Parallel收集器:类似于ParNew收集器,Parallel收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略。虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例;新生代复制算法、老年代标记-压缩
参数控制:-XX:+UseparallelGC 新生代并行,老年代串行
4.Parallel Old 收集器:Parallel的老年代版本,使用多线程和“标记-整理”算法
参数控制:-XX:+UseparalledOldGC 新生代串行,老年代并行
5.CMS收集器:是一种以获取最短回收停顿时间的收集器。目前适用于很大一部分Java应用集中于互联网网站或者B/S系统服务器上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户较好的体验
操作如下图:
6.G1收集器
常见的收集器组合:在吞吐量和响应时间权衡
总结:
二、jdk1.7和jdk1.8区别
1.jdk1.7,java类信息、常量池、静态变量都存放在Perm(永久代)里,jdk1.8,将类元数据放到本地内存,将常量池和静态变量放到java堆里。HostSpot VM将会为类的元数据明确分配和释放本地内存:解决原来产生大量类的full gc
2.-XX:PermSize和-XX:MaxPermSize参数替换成-XX:MetaspaceSize和-XX:MaxMetaspaceSize
3.优势:perSize:原来的jar包及自己项目的class存放的内存空间,这部分是参数-permSize固定的,如果Jar包多,经常会遇到permSize溢出,且每个项目都会占到自己的permGen空间。改成metaSpaces,各个项目共享class内存空间,比如二个项目都用了fast-json开源包,在metaSpaces只存一份class,提高内存利用率,更利于垃圾回收
4.元空间并不在虚拟机中,而使用本地内存。只受本地内存限制。
5.-XX:MetaspaceSize,初始化空间大小,达到该值会触发垃圾收集,同时GC会对该值调整;如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,在不超过MaxMetaspaceSize,适当提高该值
-XX:MaxMetaspaceSize:最大空间,默认是没有限制的
三、JVM参数分为三类
1.标准参数(-),所有JVM实现都必须实现这些参数的功能。例如:-verbose:class(输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突可以进行诊断);-verbose:gc(输出每次GC的相关情况);-verbose:jni(输出native方法调用情况,诊断jni调用错误信息)
2.非标准参数(-X):例如-Xms512m(堆),-Xmx512m,-Xmn200m(新生代),-Xss128(java栈大小)
3.非Stable参数:不稳定参数,将来可能随时去掉(-XX):-XX:PermSize=64m;-XX:MaxPermSize=512m
四、JVM调优的参数设置
-XX:heapDumpOnOutOfMemoryError:内存溢出导出堆信息到文件中