网络摘抄jdk1.8——jvm分析与调优
一.JVM空间说明
JDK 1.7及以前,Java 类信息、常量池、静态变量都存储在 Perm(永久代)里。类的元数据和静态变量在类加载的时候分配到 Perm,当类被卸载的时候垃圾收集器从 Perm 处理掉。
JDK 1.8 的对 JVM 架构的改造将类元数据放到本地内存中,另外,将常量池和静态变量放到 Java 堆里。HotSopt VM 将会为类的元数据明确分配和释放本地内存。在这种架构下,类元信息就突破了原来 -XX:MaxPermSize 的限制,所以PermSize的配置也是无效的,现在可以使用更多的本地内存。这样就从一定程度上解决了原来在运行时生成大量类的造成经常 Full GC 问题,如运行时使用反射、代理等
jdk1.8以前版本的class和jar包数据存储在permGen下面 ,permGen大小是固定的,而且项目之间无法共用公有的class,所以很容易碰到OOM异常。
改成metaSpaces后,各个项目会共享同样的class内存空间,比如多个项目都引用了apache-common包,在metaSpaces中只会存储一份apache-common的class,提高了内存的利用率,垃圾回收更有效率。
二.JVM参数配置
1.在jdk1.8以前,生产环境一般有如下配置
-XX:PermSize=512M -XX:MaxPermSize=1024M
OutOfMemoryError: PermGen
异常2.升级JDK1.8之后,上面的perm配置已经变成
-XX:MetaspaceSize=512M XX:MaxMetaspaceSize=1024M
MetaspaceSize如果不做配置,通过jinfo查看默认MetaspaceSize大小(约21M),MaxMetaspaceSize很大很大,前面说过MetaSpace只受本地内存大小限制。
注:jinfo -flag MetaspaceSize 1234 中的【1234】为java进程号
jinfo -flag MetaspaceSize #结果为:-XX:MetaspaceSize=
jinfo -flag MaxMetaspaceSize #结果为:-XX:MaxMetaspaceSize=
MaxMetaspaceSize为元空间的最大值,如果设置太小,可能会导致频繁FullGC,甚至OOM。
三.GC(GarbageCollection)过程
首先贴一张网上盗来的大图,用它来说明下GC的过程再合适不过。
- 新new的对象都放在Eden区(伊甸园嘛,创造的地方)
- Eden区满或者快满的时候进行一次清理(Minor Gc),不被引用的对象直接被干掉;还有引用的对象,但是年龄比较大的,挪到S0区
- 下次Eden区快满的时候,会进行上一步的操作,并且将Eden和S0区的年纪大的对象放到S1区【原理上随时保持S0和S1有一个是空的,用来存下一次的对象】
- 下下次,Eden区快满的时候,会进行上一步操作,并且将Eden和S1区的年纪大的对象放到S0区【此时S1区就是空的】
- 直到Eden区快满,S0或者S1也快满的时候,这时候就把这两个区的年纪大的对象放到Old区
- 依次循环,直到Old区也快满的时候,Eden区也快满的时候,会对整个这一块内存区域进行一次大清洗(FullGC),腾出内存,为之后的对象创建,程序运行腾地方。
清理Eden区和Survivor区叫Minor GC;清理Old区叫Major GC;清理整个堆空间—包括年轻代和老年代叫Full GC。
四. JVM参数配置指南
前面三个部分对JVM进行了整体的了解,接下来是本文的重点。
-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -Xms256m -Xmx256m
文章看下来上面这段配置的意思很简单,设置元空间的初始值和最大值,设置堆空间的初始值和最大值。
为什么MetaspaceSize要设置为128M?为什么堆内存初始值Xms设置为256M而不是512M
按照Java官方的指导
年轻代Xmn的设置为老年代存活对象的1-1.5倍。
老年代的内存大小设置为老年代存活对象的2-3倍。
jstat -gc
###
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
13824.0 22528.0 13377.0 0.0 548864.0 535257.2 113152.0 46189.3 73984.0 71119.8 9728.0 9196.2 0.259 0.287 0.546
OU表示老年代所占用的内存为 46189.3 K(大约45M);那么jvm相应的配置参数应该做如下修改
-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M -Xms180m -Xmx180m
最新文章
- CSS3动画几个平时没注意的属性
- 媒体查询判断ipad和iPhone各版本
- asp.net 页面如何将Eval中的时间显示为“yyyy-MM-dd ” 格式
- Long型转化成BigDecimal
- ios -几种常见定时器
- Android权限安全(3)权限的分级和自定义权限
- Restful风格的springMVC配搭ajax请求的小例子
- bzoj3932
- (译文)学习ES6非常棒的特性-深入研究var, let and const
- bzoj 4518: [Sdoi2016]征途
- mysql进阶(四)mysql中select
- Ribbon服务消费者
- Web版微信协议分析—版本2
- PAT 1001 害死人不偿命的(3n+1)猜想 (15)(C++&JAVA&Python)
- css样式匹配苹果个型号手机
- 【洛谷P1341】无序字母对
- org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '2012-12-12 12:01:01': not a valid representation (error: Can not parse date ";2012-12-
- ios-多语言版本开发(三)(转载)
- SpringBoot整合SpringData和Mysql数据库
- 【Linux】- Ubuntu安装redis,并开启远程访问