一、虚拟机及其构成?
1.概念
---虚拟机是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
---Java虚拟机时Java跨平台的重要原因
2.构成
---Java虚拟机主要包括:类加载器、运行时数据区、执行引擎、本地方法接口、本地方法库、垃圾回收器。
类加载器
负责把class文件装载到内存中,供虚拟机执行。
执行引擎
负责执行字节码
本地方法库
本地方法(native),一个Java的接口,调用非Java代码,其他语言:c、c++等等。
本地方法库接口JNI
允许Java代码使用以其他语言编写的native本地方法库
垃圾回收器
回收无用对象所占用的内存空间
运行时数据区
JVM的核心区域,程序运行时的工作区域,数据加工处理的场所
二、运行时数据区
程序计数器
程序计数器的作用可以看作时执行字节码的行号指示器,每个线程都有一个独立的程序计数器,独立存储,是线程的私有内存。
Java虚拟机栈(Stack)
该区域存储局部变量表,JVM只对栈帧进行出栈和压栈操作,方法调用时压栈,调用完出栈。
本地方法栈
用于调用本地的方法时使用的栈
Java堆(heap)
堆是垃圾收集管理器管理的主要区域,是被所有线程共享的一块内存区域,用于存放对象实例,几乎所有对象的实例都在这分配内存。
方法区
用于存放已被虚拟机加载的类class信息,常量,静态变量等,实质上也是堆,不同版本的JDK中方法区的实现不同。
三、堆内存
堆内存可以分为三个部分:
1.年轻代:Young
2.老年代:Tenured
3.永久代:PermGen JDK8中变成了元空间MetaSpace
年轻代:分为Eden区+两个大小相同的存活期S0,S1
---new出来的新对象现在Eden区保存,经过几次GC然后依旧存活,晋升到存活区。
---在年轻代使用的是MinorGC,这种GC采用的是复制算法
老年代
---由年轻代发来的对象,一般情况经过(15次)MinorGC存活进入老年代。
---当老年代内存不足时,触发MajorGC,即FullGC
注意:如果保存的对象超过了Eden区的大小,则直接进入老年代
永久代
---实际是指方法区,JDK8以后叫元空间。
---区别:永久代使用的是JVM的堆内存空间,元空间使用的是物理内存,受本机的物理内存限制。
注意:
JDK6之前,字符串常量池是放在永久代的方法区
JDK7中,字符串常量池从perm区移到正常的Java Heap区域了
JDK8中,永久代被元空间替代
四、垃圾回收
分代垃圾回收机制
---1.年轻代
新对象都放在Eden区,MinorGC采用复制算法,频繁操作,回收生命周期短的对象,当年轻代满后会存放到年老代区域。
---2.年老代
在年轻代经历了N(默认15)次的垃圾回收仍然存活的对象,会存入年老代,当年老代对象越来越多,就会启动MajorGC和FullGC,全面清理年轻代和年老代区域
---3.永久代
用于存放静态文件,类,方法等
注意:
---1.垃圾回收机制主要是回收JVM堆内存里的对象空间
---2.垃圾回收发生具有不可预知性,程序无法精准控制垃圾回收机制进行
---3.程序员可以通过System.gc()或Runtime.getRuntime().gc()来通知系统进行垃圾回收,只是建议,但是系统是否会进行是不确定的。