JVM小总结

JVM内存分配参数

堆的参数分配

iYFQHO.png

  • Xmx/Xms 分配堆的最大最小值,为避免系统在运行初期,频繁的minor GC/full gc,两个值最好设为一致
  • Xmn 设置新生代的内存大小值
老年代 大小 = 堆大小 - 新生代

方法区参数分配

设置持久代(也叫方法区),持久代不属于堆的范围,包括类的类型信息,常量池,域信息、方法信息。

  • 类型信息:类的名称,父类的名称,类型修饰符,类实现的接口.
  • 常量池:该类方法或域等信息所引用的常量信息
  • 域信息:成员变量的名称、类型、修饰符
  • 方法信息:方法名称、放回类型、方法参数、方法修饰符、方法字节码

-XX:PermSize 和 -XX:MaxPermSize修饰方法区的大小,一般64M 或 128M

设置线程栈大小

影响函数的调用次数,太大影响性能,太小会造成异常,这个值还会 受堆大小的影响,影响系统可支持的线程数量!

  • -Xss1M 一般够用

虚拟机内存区域大小参数

iYF1ED.md.png

GC 相关参数

iYFMDK.png

GC 垃圾收集器种类

按照不同的划分维度,可以总结为下表x

iYFKu6.png

垃圾收集器收集算法描述
新生代串行收集器复制算法单线程+独占式 client模式下的默认垃圾回收器
老年代串行收集器标记压缩算法单线程+独占式
并行收集器(工作在新生代)复制算法多线程+独占式 可指定垃圾回收线程的数目
新生代并行回收(Parallel scavenge)复制算法多线程+独占式 关注吞吐量的垃圾回收器 (系统耗时/总耗时),可以自我优化参数达到性能指标
老年代并行回收收集器标记压缩算多线程+独占式 关注吞吐量的垃圾回收器
CMS(老年代)标记-清除算法关注系统停顿时间 是多线程+ 并发
G1标记-压缩最先回收最有价值的垃圾,garbage first ,不是基于分代的思想,可以设定性能指标

Client 、Server 模式默认GC收集器组合

新生代GC方式老年代和持久代GC方式
ClientSerial 串行GC
ServerParallel Scavenge 并行回收GC

选择GC 组合的命令

命令描述
-XX:+UseSerialGCJvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收
-XX:+UseParNewGC打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收
-XX:+UseParallelGCParallel 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 VisualVMjstack:打印线程的栈信息,制作线程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:功能强大的控制台。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值