JVM
JVM的内存模型
JDK = JRE + 开发工具
JRE = JVM + 类库
hotspot jvm
java内存模型
1.栈Stack:方法运行,存放方法的局部变量
2.堆Heap:存放对象-16进制的地址值
3.方法区:存放.class反射相关信息,包含方法信息
jdk1.8的堆内存模型
堆和方法区是线程共有的,程序计数器,虚拟机栈,native栈是线程私有
堆heap
jvm所管理的内存中****最大的****一块内存区域,存放了对象
老年代:OldGen区 2/3
年轻代:Eden区 + 2*Survivor(s0区,s1区) 1/3
Eden 8/10 Survivor1/10
创建后对象优先Eden,在一次年轻代GC后进入s0或是s1,大对象和长期存活的对象老年代
方法区
*存储虚拟机加载的类信息、常量、静态变量,运行时常量池*
永久代变成了元空间Metaspace(非堆)
现实使用中,由于永久代内存经常不够用或发生内存泄露,爆出异常
基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。
元空间
**元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。**不会向方法区一样因为内存不够而发生内存泄漏
虚拟机栈JVM Stack
java方法执行的内存模型。
本地方法栈 Native Stack
Native方法执行的内存模型
程序计数器(PC Register)
JVM最小的内存区域,线程指示器
jps、jinfo、jmap
通过jps 或者 jps ‐l 查看java进程
查看某一参数的值,用法:jinfo ‐flag <参数名> <进程id>
查看内存使用情况 jmap ‐heap 进程号
JVM优化
jvm的运行参数
- 标准参数 -help -version
- -X参数 -Xint -Xcomp
- -XX参数 -XX:newSize -XX:+UseSerialGC 经常使用
-Xms和-Xmx参数
-Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大大小。
-Xms512m:等价于-XX:InitialHeapSize 设置jvm初始堆内存512M
-Xmx2048m:等价于-XX:MaxHeapSize,设置jvm最大堆内存2048
[root@node01 test]# java ‐Xms512m ‐Xmx2048m TestJVM
JVM垃圾回收机制GC
垃圾回收的常见算法
引用计数法
假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的计数器的值为0,就说明对象A没有引用了,可以被回收
标记清除法
先从根节点标记的引用对象,后清楚未被标记引用的对象
标记压缩法
先从根节点标记的引用对象,后将标记对象和未被标记对象压缩到内存一段,清楚垃圾
复制算法
内存一分为二,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。
垃圾收集器
串行垃圾收集器
单线程垃圾回收
并行垃圾收集器
多线程垃圾回收
CMS垃圾收集器
并发,标记-清除算法,针对老年代垃圾回收,通过参数-XX:+UseConcMarkSweepGC进行设置
G1垃圾收集器
jdk9之后默认的垃圾收集器
- 第一步,开启G1垃圾收集器 -XX:+UseG1GC
- 第二步,设置堆的最大内存 -Xmx1024m
- 第三步,设置最大的停顿时间
三种模式 Young GC、Mixed GC、Full GC
最大的区别在于它取消了年轻代、老年代的物理划分,将堆划分为若干个区域(Region)
在G1中,有一种特殊的区域,叫Humongous区域。存储巨型对象