前言
JVM(Java Virtual Machine的简称。意为Java虚拟机。)。指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。
JVM的组成部分主要包括5部分:
1.JVM内存划分
1.1堆
所有创建的对象信息都放在这个区域,堆也是JVM中最大的一部分。是线程共享
的。
1.新生代:
新创建的对象会存放在新生代,经历了一定次数的GC(垃圾回收)之后,依然存活下来的数据,会移动至老年代(HotSpot的默认回收次数是15次)
2.老年代:
经历了一定次数还存活的对象以及大对象
3.新生代又分为3个部分:
Eden,ServivorFrom、ServivorTo三个区
4.为什么大对象直接存放到老年代?
答:因为大对象创建和消耗的时间比较多,性能比较低,如果放到新生代,可能需要频繁的创建和销毁对象,导致JVM运行效率降低。
5.为什么要进行堆分代?
答:分代的理由就是为了优化GC性能,如果没有分代,那么我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样会对堆的所有区域进行扫描。而我们的很多对象都是朝生暮死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先对新生代的区域进行回收,这样可以提高效率。
1.2Java虚拟机栈
Java虚拟机栈是线程私有
的
布局变量表:存放方法参数和局部变量(8大基本数据类型)
操作栈:每个方法会生成一个先进后出的操作栈
动态链接:指向运行时常量池方法的引用
方法返回地址:PC寄存器的地址
1.3本地方法栈
本地方法栈和JVM栈类似,只不过JVM栈是为字节码服务的,而本地方法栈是为本地方法服务的,本地方法栈是线程私有的
1.4程序计数器
记录线程执行的行号,线程私有
的
1.5方法区
1.JDK7时 叫做方法区,也叫永久代
方法区主要存储被虚拟机加载的类型信息、常量、静态变量。(字符串常量池移至堆中)
2.JDK8时 叫做元空间
废除永久代的概念,元空间存储在本地内存中,将JDK7中永久代剩余的内容(主要是类型信息)全部移至元空间中。
2.线程私有还是公有
1.线程私有:
本地方法栈,Java虚拟机栈,程序计数器
2.线程共有:
堆,方法区
3.JVM调优
JVM参数调优
(1)-Xmx10m 堆最大容量
(2)-Xms10m 堆最小容量的设置
(3)通常情况下可以将Xmx和Xms的大小设置相同,这样可以防止堆扩容造成抖动