JVM学习整理

1. 核心参数

  1. -Xms2048m、-Xmx2048m、-Xss1024m
    其中-x是表示非标准化的参数,-xms表示jvm的heap内存的起始内存,默认是服务器内存的1/64 ,-xmx 表示jvm的heap内存的最大内存,默认是服务器的内存的1/4 ,如果heap内存不够的话,则会抛出 oom outofmemoryError,
    【JVM学习整理】-xss 表示线程栈的内存空间大小,java进程中是有多个线程的,每一个线程中内存占有的空间是由-xss控制,如果虚拟机栈或者本地方法栈调用层次不够的话,则会抛出StackOverflowError ,如果扩展线程栈不够的话,则会抛出oom
    理解内存构成:-xmx+程序计数器+虚拟机栈+本地方法栈+方法区
    JVM学习整理
    文章图片

  2. -XX:MetaspaceSize,-XX:MaxMetaspaceSize
    MetaspaceSize并不是说指定了元空间的大小,而是执行了当metaSpace扩容时触发fullGC的初始化阈值,也就是最小的阈值,对于64位服务器jvm来说,其默认的-XX:MetaspaceSize的值为21MB,如果超过MaxMetaSpaceSize则会抛出OOM,因此可以将metaspaceSize设置大点,MaxMetaSpaecSize可以不设置
  3. -XX:+PrintGcDetails
    查看GC情况

    其中,Allocation Failure表示新生代空间不足
    141816K->10738k(141824k)表示GC前的内存,GC后的内存,总内存
    之后的表示总个堆内从的大小
    默认的-xms为1/64
2. jvm内存模型
JVM学习整理
文章图片

? jvm内存模型是由:堆内存、虚拟机栈、本地方法栈、程序计数器、以及方法区,在jvm1.7之前,堆内存是被分为新生代、老年代、和永久代,之前永久代也就是表示方法区,主要存放常量池、静态变量、类信息、编译代码。
? 需要记住的是,在jvm1.8之后,就把方法区给移除了,转成元数据区,该内存区域为本地内存,可以使用-XX:MetaspaceSize和-XX:MaxMetaspaceSize来指定元空间的大小。
3. jvm优化命令
  1. jstat
    jstat是JDK自带的一个轻量级小工具,利用jvm内建的指令对java应用程序资源和性能进行实时和命令行的监控,包括heap size和GC情况。
    jstat -gcutil pid :查询pid的gc情况(gc了多少次,现在一个内存情况) jstat -gc pid 2s 3 : 每隔2s中内查看gc的情况,执行3次

  2. jps
    查看liunx执行的java进程号
    jps -v 查看jvm启动的参数

  3. 堆栈分析jstack
    主要分析堆栈空间,也就是分析线程的情况,可以分析出死锁问题,以及cpu100%的问题。

  4. 堆空间分析jmap
    jmap是分析jvm堆的问题,可以检查内存的泄漏、检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小。
    jmap -dump:live,format=b,file=dump.hprof pid 进行打印pid的堆dump文件 jmap -heap 打印heap的概要信息、GC使用算法、Heap的配置以及使用情况

导出的dump文件可以使用MAT进行分析,MAT是一款肥西dump文件的插件
4. 专有名词
4.1 内存溢出、内存泄露 内存溢出(out of memory)和内存泄漏是不一样的,内存溢出的话是没有足够的内存供申请者使用,也就是内存不够用,导致放进行去的对象使得内存池溢出了,内存泄露是指程序申请内存后,已经使用了但是无法释放已申请的内存空间,一次内存泄漏不会由太大的问题。内存泄漏的堆积最终会导致内存溢出的。
4.2 dump 在计算机的领域,dump是转存的意思,在jvm中也可以被称为存储jvm运行时的内存空间的使用情况。完整的dump文件能够保存程序内部的内存、堆栈、句柄、线程等程序运行相关的信息,dump可以具有堆dump和堆栈dump,堆dump就可以分析出对应的问题所在。
5. 实际问题
4.1 如何解决OOM问题 JVM学习整理
文章图片

    推荐阅读