生命不息,学习不止,对一切都要维持敬畏之心。
若有不正之处,请谅解和批评指正,不胜感激。

1.概览

图片说明

  • 线程共享:方法区和堆
  • 线程私有:虚拟机栈,本地方法栈,程序计数器
  • 方法区是JVM规范,元空间为Hotspot对JVM方法区规范的实现
  • 元空间一般不设置上限,因为元空间大小为内存大小

2. 程序计数器

  • 是什么?

    • 程序计数器是一块较小的内存空间.它可以看成是当前字节码(.class文件)的行号指示器
    • 线程是一个独立的执行单元,由CPU控制
    • 字节码解释器工作时,就会通过这个程序计数器,来选取下一条需要执行的字节码指令
  • 为什么?

    • 多线程本质是CPU的中断,所以每个线程都有自己独立的程序计数器,用来继续执行线程.所以各条线程之间的程序计数器互不影响,独立存储.
  • 特点

    • 运行时内存区域中唯一不会出现OutOfMemoryError情况的区域

3.虚拟机栈

  • 是什么?

    • 用于方法执行的一块内存区域
  • 为什么?

    • 每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息.每一个方法从调用到执行完成的过程,就对应着一个栈帧在栈中入栈到出栈的过程.
  • 特点

    • 一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。
    • 线程请求的深度大于栈的深度,会抛出StackOverflowError异常

4. 本地方法栈

  • 是什么?

    • 用于执行本地方法的一块内存区域
    • native修饰的方法且无方法实现的为本地方法
  • 为什么?

    • 同虚拟机栈
  • 特点

    • Hotspot将虚拟机栈和本地方法栈合并在一起

5. 堆

  • 是什么?

  • 为什么?

    • 此区域唯一目的就是存在对象实例
    • 堆是JVM所管理的内存区域中最大的一块区域,被所有线程共享
  • 特点

    • 堆是垃圾回收器主要的收集和管理区域.GC堆
    • 堆分为-新生代和老年代,新生代中分为Eden(伊甸区),From区,和To区.
    • From和To区域会因为标记-复制垃圾收集算法交替更换,默认15次,存活的对象进入老年代

6. 方法区

  • 是什么?

    • 各个线程共享的内存区域,用于存储类信息,常量,静态变量,即时编译后的代码数据
    • 类信息->类版本号,方法,接口
  • 为什么?

    • 1.8 使用元空间实现方法区,最大大小等于内存大小
  • 特点

    • 会发生对常量池的回收和类型类的卸载
    • 会出现OutOfMemoryError错误

7. 运行时常量池

  • 是什么?
    • 方法区的一部分
    • 用于存放编译时生成的字面量和符号引用
    • 具备动态性 String.intern()

8. 直接内存

  • 是什么?

    • 并不是JVM虚拟机规范中的定义部分,因为NIO的加入也会被频繁使用.
  • 特点

    • 不会收到JVM内存的限制,但是会受到本机内存的限制,也会出现OutOfMemoryError错误

9. 基础命令

9.1 常用的JVM命令

  • -Xms 设置JVM最小分配内存大小

  • -Xmx 设置JVM最大可用内存大小

  • -Xss 设置每个线程的每个栈大小.jdk1.5之后默认大小为1M.

  • -XX:+HeapDumpOnOutOfMemeoryError 内存溢出快照

  • -XX:HeapDumpPath=${目录}/***.hprof,如果不指定文件名

  • -XX:MaxMetaspaceSize: 设置 元 空间 最大值, 默认 是- 1, 即 不 限制, 或者说 只 受限 于 本地 内存 大小。

  • -XX: MetaspaceSize: 指定 元 空间 的 初始 空间 大小, 以 字节 为 单位, 达到 该 值 就会 触发 垃圾 收集 进行 类型 卸载, 同时 收集 器 会对 该 值 进行 调整: 如果 释放 了 大量 的 空间, 就 适当 降低 该 值; 如果 释放 了 很少 的 空间, 那么 在 不超过

    XX: MaxMetaspaceSize( 如果 设置 了的 话) 的 情况下, 适当 提高 该 值。 ·-XX: MinMetaspaceFreeRatio: 作用 是在 垃圾 收集 之后 控制 最 小的 元 空间 剩余 容量 的 百分比, 可减少 因为 元 空间 不足 导致 的 垃圾 收集 的 频率。 类似 的 还有

    XX: Max- MetaspaceFreeRatio, 用于 控制 最 大的 元 空间 剩余 容量 的 百分比

  • -XX: MaxDirectMemorySize 直接内存容量大小,如果不指定,则和JVM堆的值一样。

9.2 查看JVM默认参数信息命令

  • java -XX:+PrintCommandLineFlags -version
  • jdk8环境下,默认使用 Parallel Scavenge(新生代)+ Parallel Old(老年代)

9.3 JDK1.8-Windows-JVM-默认参数

  • -XX:InitialHeapSize=532796736 默认堆大小

  • -XX:MaxHeapSize=8524747776 最大堆大小

  • -XX:+UseCompressedClassPointers 默认开启类指针压缩

  • -XX:+UseCompressedOops 默认开启对象指针压缩

  • -XX:-UseLargePagesIndividualAllocation 单独分配大页面以获得更好的关联性

  • -XX:+UseParallelGC 默认使用Parallel垃圾收集器

9.4 JDK1.8-Linux-JVM-默认参数

  • -XX:InitialHeapSize=61780736

  • -XX:MaxHeapSize=988491776

  • -XX:+PrintCommandLineFlags

  • -XX:+UseCompressedClassPointers

  • -XX:+UseCompressedOops

  • -XX:+UseParallelGC