JVM学习整理

1. 核心参数

  1. -Xms2048m、-Xmx2048m、-Xss1024m

    其中-x是表示非标准化的参数,-xms表示jvm的heap内存的起始内存,默认是服务器内存的1/64 ,-xmx 表示jvm的heap内存的最大内存,默认是服务器的内存的1/4 ,如果heap内存不够的话,则会抛出 oom outofmemoryError,

    -xss 表示线程栈的内存空间大小,java进程中是有多个线程的,每一个线程中内存占有的空间是由-xss控制,如果虚拟机栈或者本地方法栈调用层次不够的话,则会抛出StackOverflowError ,如果扩展线程栈不够的话,则会抛出oom

    理解内存构成:-xmx+程序计数器+虚拟机栈+本地方法栈+方法区

    JVM学习整理_第1张图片

  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学习整理_第2张图片

​ 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学习整理_第3张图片

你可能感兴趣的:(JVM)