前言
今天超级忙啊!但是学习笔记还是要记录一下的
正文
JVM的内存区域划分可分为:1.堆内存空间、2.Java虚拟机栈区域、3.程序计数器、4.本地方法栈、5.元空间区域、6.直接内存。
- 堆内存空间:JVM中占用内存空间最大的是堆,平常对象的创建大部分都是在堆上分配内存的,是垃圾回收的主要目标和方向。
- 本地方法栈区域:Native Mehod Stack 与 Java 虚拟机栈的作用非常相似,区别是 Java 虚拟机栈为虚拟机执行 Java 方法或者为字节码而服务,本地方法栈是为了 Java 虚拟机栈得到 Native 方法。
- Java虚拟机栈区域:负责 Java 的解释过程、程序的执行过程、入栈和出栈,它是与线程相关的,当启动一个新的线程时,Java 程序就会分配一个Java 虚拟机栈提供运行;Java 虚拟机栈从方法入栈到具体字节码执行是一个双层栈结构,可以栈里包含栈。
- 程序计数器:记录线程执行位置,线程私有,因为操作系统不停的调度,无法获取到线程被调度之前的位置,程序计数器提供了这样一个线程执行位置。
- 元空间区域:在原来的老的 Java 7 之前划分中,永久代用来存放类的元数据信息、静态变量以及常量池等。在现在 Java 8 后类的元信息存储在元空间中,静态变量和常量池等并入堆中,相当于原来的永久代中的数据,被元空间和堆内存给瓜分了。
- 直接内存:使用了 Java 的直接内存的 API 的内存,例如缓冲ByteBuffer,可以控制虚拟机参数调整大小,而本地内存是使用了 native 函数操作的内存,是不受 JVM 管理控制。
上图是堆内存分代模型图,当 JVM 进行 GC(垃圾回收)时,JVM 会发起 “Stop the world”,所有的业务线程都进行停止,进入 SafePoint状态,JVM 回收垃圾线程开始进行标记和追溯,如何解决这种停止和如何减少 STW 的时间呢?
目前主流垃圾收集器采用分代垃圾回收方式,大部分对象的声明周期都比较短,只有少部分的对象才存活的比较长,分代垃圾回收会在逻辑上把堆内存空间分为两部分,一部分为年轻代,一部分为老年代。