前言
在linux部署的java项目,通常会因为低质量代码或者服务器的资源瓶颈产生一些不可预知的问题。
一、java的内存管理机制
因为jvm虚拟机的自动内存管理,使得开发人员减少了手动清理内存的操作,在这里不过多进行描述jvm,简单讲一下机制。
基本常说的jvm调优,也就是针对于jvm中的堆进行调优操作。
Java堆是垃圾收集器管理的主要区域,因此很多时候也被称作"GC堆",从内存回收的角度看,现在收集器都基本采用分代回收的算法 所以Java堆呢还可以细分为:新生代、老年代。 再细致一点的有:Eden空间、From Survivor空间、To Survivor空间。
二、jvm调优
JVM提供 -XX:+PrintGCDetails这个收集器日志参数
栈的空间大小设置:-Xss 为jvm启动的每个线程分配的内存大小
堆的空间大小设置:-Xms 设置堆的初始值 -Xmx 设置堆的最大值
方法区空间大小设置:-XX:MetaspaceSize 方法区的初始值大小
-XX:MaxMetaspaceSize 方法区的最大值
分代收集的默认比例
young:old 1:2 可以通过参数 –XX:NewRatio 来指定
eden:s0:s1 8:1:1 可以通过参数 –XX:SurvivorRatio 来设定
占用内存较大的对象,对于虚拟机内存分配是一个坏消息,虚拟机提供了一个 -XX:PretenureSizeThreshold 让大于这个设置的对象直接存入老年代。
长期存活的对象会存入老年代。虚拟机给每个对象定义了一个Age年龄计数器,对象在Eden中出生并经过第一次Minor GC后仍然存活,对象年龄+1,此后每熬过一次Minor GC则对象年龄+1,当年龄增加到一定程度默认15岁,就会晋升到老年代。
可通过参数设置晋升年龄 -XX:MaxTenuringThreshold
总结
回收机制没说,调优日志参数没说,如何调优没说??