JVM内存分配参数
堆的参数分配
- Xmx/Xms 分配堆的最大最小值,为避免系统在运行初期,频繁的minor GC/full gc,两个值最好设为一致
- Xmn 设置新生代的内存大小值
老年代 大小 = 堆大小 - 新生代
方法区参数分配
设置持久代(也叫方法区),持久代不属于堆的范围,包括类的类型信息,常量池,域信息、方法信息。
- 类型信息:类的名称,父类的名称,类型修饰符,类实现的接口.
- 常量池:该类方法或域等信息所引用的常量信息
- 域信息:成员变量的名称、类型、修饰符
- 方法信息:方法名称、放回类型、方法参数、方法修饰符、方法字节码
-XX:PermSize 和 -XX:MaxPermSize修饰方法区的大小,一般64M 或 128M
设置线程栈大小
影响函数的调用次数,太大影响性能,太小会造成异常,这个值还会 受堆大小的影响,影响系统可支持的线程数量!
- -Xss1M 一般够用
虚拟机内存区域大小参数
GC 相关参数
GC 垃圾收集器种类
按照不同的划分维度,可以总结为下表x
| 垃圾收集器 | 收集算法 | 描述 |
|---|---|---|
| 新生代串行收集器 | 复制算法 | 单线程+独占式 client模式下的默认垃圾回收器 |
| 老年代串行收集器 | 标记压缩算法 | 单线程+独占式 |
| 并行收集器(工作在新生代) | 复制算法 | 多线程+独占式 可指定垃圾回收线程的数目 |
| 新生代并行回收(Parallel scavenge) | 复制算法 | 多线程+独占式 关注吞吐量的垃圾回收器 (系统耗时/总耗时),可以自我优化参数达到性能指标 |
| 老年代并行回收收集器 | 标记压缩算 | 多线程+独占式 关注吞吐量的垃圾回收器 |
| CMS(老年代) | 标记-清除算法 | 关注系统停顿时间 是多线程+ 并发 |
| G1 | 标记-压缩 | 最先回收最有价值的垃圾,garbage first ,不是基于分代的思想,可以设定性能指标 |
Client 、Server 模式默认GC收集器组合
| 新生代GC方式 | 老年代和持久代GC方式 |
|---|---|
| Client | Serial 串行GC |
| Server | Parallel Scavenge 并行回收GC |
选择GC 组合的命令
| 命令 | 描述 |
|---|---|
| -XX:+UseSerialGC | Jvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收 |
| -XX:+UseParNewGC | 打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收 |
| -XX:+UseParallelGC | Parallel Scavenge 并行回收GC +Serial old |
| -XX:+UseConcMarkSweepGC | 使用ParNew + CMS + Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用。 |
| -XX:+UseParallelOldGC | 使用Parallel Scavenge + Parallel Old的收集器组合进行回收 |
| -XX:+UseG1GC | 使用G1收集器 |
优化的一些方法
- 尽量将对象,留在新生代进行回收,因为full gc往往比minor gc更慢
- 大对象直接放入老年代
- 将堆 大小 最大值和最小值设为一致,避免内存颠簸
- 调整gc垃圾收集器的参数 ,比如垃圾收集线程数,新生代和老年代的倍数等等
- 开启JIT即时编译,调整启动编译的门限值
- 禁止显示GC(-XX:+DisableExplicitGC) ,禁止类元数据回收(-Xnoclassgc),禁用类验证(-Xverify:none)
java Dump
Java虚拟机运行的快照,将Java虚拟机运行时的状态和信息保存到文件,主要分为两种
- 线程Dump,包含所有线程的运行状态。文本格式
- 堆Dump,包含线程Dump,幵包含所有堆对象的状态。二进制格式。
制作java dump的方式
| 自动制作java dump | 使用图形化工具制作Dump | 使用命令行制作Dump |
|---|---|---|
| 指示虚拟机在发生内存不足错误时,自动生成堆Dump,-XX:+HeapDumpOnOutOfMemoryError | 使用JDK(1.6)自带的工具:Java VisualVM | jstack:打印线程的栈信息,制作线程Dump,jmap:打印内存映射,制作堆Dump。 |
JDK自带的命令工具
-
jps:查看本机的Java中进程信息。
-
jstack:打印线程的栈信息,制作线程Dump。
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈
- jmap:打印内存映射,制作堆Dump。
jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。可以使用jmap生成Heap Dump,堆Dump是反应Java堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。 一般,在内存不足、GC异常等情况下,我们就会怀疑有内存泄露。这个时候我们就可以制作堆Dump来查看具体情况。
- jstat:性能监控工具。
jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。
-
jhat:内存分析工具。
-
jconsole:简易的可视化控制台。
-
jvisualvm:功能强大的控制台。