网站建设阿里云,asp技术做网站,网站主页和子页风格如何统一,车网站建设策划书常用内存选项
-Xmx#xff1a; 最大堆大小
-Xms#xff1a;最小堆大小
-Xss #xff1a;线程堆栈大小#xff0c;默认1M
生产环境最好保持 Xms Xmx
java内存研究
内存布局 可见#xff1a;
堆大小 新生代 老年代#xff0c;新生代EFrom SurvivorTo Survivor。新…常用内存选项
-Xmx 最大堆大小
-Xms最小堆大小
-Xss 线程堆栈大小默认1M
生产环境最好保持 Xms Xmx
java内存研究
内存布局 可见
堆大小 新生代 老年代新生代EFrom SurvivorTo Survivor。新生代和老年代的比例通过-XX:NewRatio2选项指定新生代内部E/S0/S1的比例用-XX:SurvivorRatio8选项指定。-Xmx和-Xms设置的是堆大小即设置的是新生代和老年代M即永久代不算在堆里面。永久代存放的是类的元数据信息比如类名、属性、方法、访问限制等。动态代理生成的类定义也会存放在永久代所以如果动态生成的类太多永久代空间就会不够这一点需要注意参看这里
对于某个服务我们通过
-Xmx256m -Xms256m设置堆大小为256M但服务跑起来后通过top命令查看它占了500M的物理内存。不要奇怪剩下的200多M是被方法区、线程堆栈等占用了。
E/O的比例
新生代和老年代的比例默认是1:2通过-XX:NewRatio2选项指定我们可通过jstat -gc命令查看结果来印证 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
16384.0 16384.0 3776.0 0.0 54272.0 28511.2 175104.0 100739.4 73816.0 70718.7 9344.0 8572.7 408 4.010 7 1.666 5.676EC是Eden区大小则新生代总大小为S0S1E87040。
OC为老年代大小175104我们看到刚好1:2的比例。
新生代到老年代的转化
新生代是 GC 收集垃圾的频繁区域。 当对象在 Eden ( 包括一个 Survivor 区域这里假设是 from 区域 ) 出生后在经过一次 Minor GC 后如果对象还存活并且能够被另外一块 Survivor 区域所容纳 ( 上面已经假设为 from 区域这里应为 to 区域即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 )则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 )并且将这些对象的年龄设置为1以后对象在 Survivor 区每熬过一次 Minor GC就将对象的年龄 1当对象的年龄达到某个值时 ( 默认是 15 岁可以通过参数 -XX:MaxTenuringThreshold 来设定 )这些对象就会成为老年代。 但这也不是一定的对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。
From Survivor区域与To Survivor区域是交替切换空间在同一时间内两者中只有一个不为空。jstat -gc结果里的S0和S1就是这2个survivor区。
方法区
方法区存放类定义和元信息像字符串池和类的静态成员不在方法区里而是放在堆上。
Major GC 和 Full GC 的区别
Full GC收集young gen、old gen、perm gen
Major GC有时又叫 old gc 只收集老年代 old gen
Minor GC只收集新生代young gen。
生产问题案例
JVM堆使用率居高不下
现象JVM堆使用率过很久才能降下来。
原因是程序内未做分批处理一次性分配了大片连续内存常见于ArrayList中导致新生代区域不够分所以分到了老年代。老年代只能在执行频度更低、执行速度更慢的major gc里清理而不会在频繁执行、速度更快的minor gc里清理所以导致JVM堆内存占用要过一段较长的时间才能看到下降。实际中遇到过2万条记录在8G内存的容器里就占用了2G堆内存的情况。
线程间歇性发呆
现象一个函数内的两个步骤间并无耗时操作但线程却仿佛发呆了几秒不做事
可能的原因
服务内的数据库、redis连接池耗尽线程挂起等可用的连接cpu和内存占用率很高日志打印过多写日志操作阻塞了线程比如在一个2C接口里去打印异常堆栈
定位手段
既然是线程阻塞就用jstack命令dump出线程堆栈查看可疑的阻塞。这跟早期C里用gdb的thread apply all bt 命令查看堆栈一样。