Java jvm内存调优
Jdk:java开发工具包
Jre:java运行环境,运行你编写的java程序
Jvm:java虚拟机,.class文件在虚拟机上运行
如何选择合适的java虚拟机
》》》选择稳定的jdk(慎用新出的,新特性的)
》》》根据平台和应用,选择合适厂商的jdk。HP-UX只能选择HP JDK,AIX只能选择IBM JDK;windows 、linux可以选择SUN JDK;solaris平台最好使用SUN JDK;开源JDK,目前生产环境中用的极少
》》》32bit or 64bit
》》》内存需求较小,CPU密集型应用选32bit
》》》大内存应用则选64bit(突破4G内存限制、吞吐量稍高)
Java内存
》》》Java内存 = 堆内存+非堆内存
》》》堆内存 = 年轻代+年老代 -Xms(最小)-Xmx(最大)
》》》非堆内存 = 永久代+其他 -XX:Pemsize -XX:MaxPermSise
》》》最新的java8中的jvm已经去掉了永久代,以Metaspace元空间代替
内存典型问题
》》》OOM VS ML
》》》OOM内存溢出,是程序在申请内存时,没有足够的内存供其使用
》》》ML内存泄露,是指程序在申请内存后,无法释放已申请的内存空间,导致这块内存一直占用
》》》最终表现基本是一样的,通常内存泄露ML最终会导致OOM错误。实际应用中不要太过纠结或划清界限,每种现象都是关联的。
内存问题常发生在什么区域
》》》heap堆内存和pemanent区
》》》JVM进程内存和java使用的第三方本地代码
比如:
》》》java堆内存不足,无法再分配新对象或内存块
》》》java堆内存充足,但是S0,S1,eden,Old区分配不合理
如何预防内存方面的问题
系统方面:
》》》足够的物理内存
》》》最佳的堆设置
》》》稳定的OS,jdk等
》》》适当的垃圾回收算法策略
代码方面:
》》》不要放置大量对象到session中
》》》用完的资源一定要释放,例如IO,file,jdbc
》》》不要违反j2ee规范
》》》合理的从数据库取得适量的数据(能从缓存拿就从缓存拿)
》》》好的代码习惯