jvm:Java虚拟机,是一个提供Java代码运行的虚拟环境,每一个Java程序在运行时,都有自己的一个jvm
Java核心3大区域:栈内存、堆内存、方法区(永久代)
栈内存: (私有)
存放内容:基本数据类型(整数、小数、字符、布尔...)
int a = 1
int b = 2
对象的引用(变量o):
Object o = new Object();
特点:每一个线程创建时,jvm会给它分配一个属于自己的栈内存,当线程运行结束时,属于它的栈内存也会释放
每个栈由多个栈帧组成,对应每次方法调用时所占的内存
每个线程只能有一个活动栈帧,对应者当前正在执行的那个方法。
栈内存溢出:
1、栈帧过多导致的栈内存溢出
2、栈帧过大导致的栈内存溢出
堆内存
作用:堆是用于存放对象的内存区域
特点:
堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。
堆的区域是用来存放对象的实例,因此也是垃圾收集器管理的只要区域
堆在逻辑上分为,新生代和老年代
运行原理(l理解):
新创建的对象,首先放在新生代中的Eden区
当Eden区放满后,JVM会扫描Eden区,将仍然存活(有人用)的对象转移到S0区
转移完成后,JVM会一次性把Eden区和S1区清空
后续如果再有新的对象创建,继续往Eden区存放
当过了一段时间后,Eden又放满了,JVM会扫描Eden区+S0区,将存活对象转移到S1区(原来是空的),并一次性把Eden区+S0区清空
当某次转移的时候,发现S0或者S1空间不足,不能存放下转移的数据,此时JVM会将存活对象转移到老年代中
永久代
• 永久代也叫(Method Area)
• 各线程共享,主方法区要存放类信息、常量、静态变量,如
public static int a = 10
• 垃圾回收行为比较少见
作用:存储每个类的结构 代码中静态的,固定的数据
Java8从Jvm中移除了PermGen,使用Metaspace(元空间)来代替永久代
Metaspace不存在Jvm中,而是存在本地内存中
配置元空间初始值和最大值参数:
-XX:MetaspaceSize=64m
-XX:MaxMetaspaceSize=64m
JVM启动时,分成2种模式:
当检测到本地电脑配置低时,启动client模式
当检测到本地电脑配置高时,启动server模式
server模式性能更好,但是会占用更多的资源
如何判断配置高或低?(CPU核数、内存大小、操作系统)
垃圾回收-GC
◼ 新生代引发的GC叫YoungGC
◼ 老年代引发的GC叫FullGC
FullGC会引起整个Jvm的用户线程暂停,待垃圾回收完毕后,才继续运行
• 哪些内存需要回收?
确定对象“存活”还是“死去” 通过根搜索算法(GC Roots)
• 什么时候回收?
• 如何回收
堆垃圾回收算法
◼ 标记-清除算法
◼ 复制算法
◼ 标记-压缩算法
◼ 分代收集算法
分代收集算法
• 当代的商业虚拟机都采用“分代收集”
• 根据对象的存活周期的不同将内存划分成几块,一般Java堆分为新生代和老
年代
• 新生代采用复制算法
• 老年代采用标记-压缩算法
垃圾收集器
• Jvm不同的区域可以采用不同的垃圾收集器组合,主要有:
– Serial收集器(串行)
– ParNew收集器(并行)
– CMS收集器(并发)
– G1(时间优先)
CMS收集器
• 并发收集器(ConcurrentMarkSweep)
• 采用了标记-清除、标记-压缩算法
• 并发收集、低停顿
• 缺点:
– 消耗cpu
– 会产生内存碎片
– 浮动垃圾(Concurrent Mode Failure)
CMS相关参数
-XX:+UseConcMarkSweepGC:默认关闭,ParNew+CMS+Serial Old,当CMS收集器出现
ConcurrentModeFailure错误(Jvm预留空间不足以容纳程序使用),采用后备收集器Serial Old
-XX:CMSInitiatingOccupancyFraction=80:CMS收集器在老年代空间被使用多少时触发FullGC,默认为92
-XX:+UseCMSCompactAtFullCollection:CMS收集器在FullGC时开启内存碎片的压缩,默认关闭
-XX:CMSFullGCsBeforeCompaction=8:执行多少次不压缩FullGC后,进行一次压缩,默认是0(代表每次
FullGC都进行压缩)
-XX:+UseCMSInitiatingOccupancyOnly:使用手动定义初始化定义开始,禁止hostspot自行触发CMS GC
-XX:ParallelGCThreads=8:并行收集器的线程数,此值最好配置与处理器数目相等 同样适用于CMS
日志参数:
-XX:+HeapDumpOnOutOfMemoryError:当发生内存溢出时,进行堆内存dump-XX:+PrintGCDetails:打印
GC的详细信息