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