5年履历,应该领会JVM常用的知识,下面说一下JVM有哪些知识点:
JVM整体架构
JVM内存管理
java运行时数据区堆(线程共享)虚拟机启动时 确定,用于存放工具实例,险些所有的工具(包罗常量池)都在堆上分配内存,当 工具无法再该空间申请到内部时将抛出 OutOfMemoryError 异常。同时也是垃圾网络器管理的主要区域。可通过 -Xmx _xms参数来划分指定最大堆和最小堆。
新生区:
类降生、发展、消亡的区域,一个类在这里发生,应用,最后被垃圾接纳器网络。
伊甸区(Eden space):所有的类都在该区域new 出来的,当伊甸区的空间用完时,程序又需要确定工具,JVM垃圾接纳器将对伊甸区进行垃圾接纳(Minor GC),将伊甸园去中的不再 被其他工具所引用的工具进行销毁。然后将伊甸园中的剩余工具移动到幸存0区。若幸存0区满了,再对该区进行垃圾接纳,然后移动到1区。那若是1区也满了呢??
幸存者区(Survivor space):0区,1区
暮年区:
新生区经由多次GC仍然存回的工具移动到暮年区。若暮年区也满了,那么这个时刻将发生 MajorGC(FullGC),进行暮年区的内存整理 ,若暮年区执行了Full GC 之后发现仍然无法进行工具的保留,就会发生OOM异常”OutOfMemoryError“。
若是一个实例工具在新生代 中,乐成的在15次垃圾接纳之后,就会移动到暮年月中
2. java 栈(线程私有)
一个线程对应一个栈,每个方式在执行的同时都市确定一个栈帧(用户存储局部变量表,操作数栈,动态链接,方式出口等信息),不存在垃圾接纳问题,只要线程一竣事该栈就释放,生命周期和线程一致。
该区域规范了两种异常:
线程请求的栈深度大于虚拟机栈所允许的深度,并抛出StackOverFlowError异常
若虚拟机栈可动态扩展,当无法申请到足够内存空间时将抛出OutOfMemoryError,通过JVM 参数 -Xss指定栈空间,空间巨细决议函数挪用的深度
3. 方式区(线程共享)
类的所有字段和方式字节码,以及一些特殊方式如组织函数,接口代码也在此界说。简朴的说,所有界说的方式的信息都保留在该区域,静态变量 + 常量 + 类信息(组织方式/接口界说) + 运行时常量池都存在方式区中。
4.元数据区
元数据区取代了永远代(jdk1.8之前).本质和永远代相似,都是对JVM规范中方式区的实现,区别在于元数据区 不再虚拟机汇总,而是使用内陆物理内存,永远代在虚拟机中,永远代逻辑结构上属于堆,然则物理上不属于堆,堆巨细 = 新生代 + 暮年月。 元数据区有可能发生OutOfMemory 异常
jdk6 以及之前:有永远代,常量池在方式区
jdk7 ,有永远代,常量池在堆上
jdk8之后,无永远代,常量池在元空间
元数据区的动态扩展,默认–XX:MetaspaceSize值为21MB的高水位线。一旦触及则Full GC将被触发并卸载没有用的类(类对应的类加载器不再存活),然后高水位线将会重置。新的高水位线的值取决于GC后释放的元空间。若是释放的空间少,这个高水位线则上升。若是释放空间过多,则高水位线下降。
5、程序计数器(线程私有)
纪录当前执行的字节码指令的位置,也就是纪录现在执行到了那一条字节码指令
6、内陆方式栈(线程私有)
新生代和暮年月的工具分配机制
工具优先在eden分配
大工具直接进入暮年月:字符串,数组,虚拟机提供了一个-XX:PretenureSizeThreshold参数,令大于这个设置的工具直接在暮年月分配。这样做的目的是阻止在Eden区以及两个Survivor区直接放生大量的内存复制
耐久存活的工具将进入暮年月
动态工具岁数判断机制:为了更好的顺应差异程序的内存情形,虚拟机并不是永远要求工具的岁数必须到达某个牢靠的值(好比前面说的 15)才会被提升到暮年月,而是会去动态的判断工具岁数。若是在 Survivor 区中相同岁数所有工具巨细的总和大于 Survivor 空间的一半,岁数大于即是该岁数的工具就可以直接进入暮年月。
空间担保机制
在发生Minor GC 之前,虚拟时机先检查暮年月最大可用的延续空间是否大于新生代所有工具的总空间,若是确定,那么Minor GC 可以确保是平安的。若是不确定,则虚拟时机查看HandlerPromotionFailure设置值是否允许担保失败》若是允许,就是看看暮年月的内存巨细,是否大于之前每一次Minor GC后进入暮年月的工具的平均巨细。若是上面的步骤判断失败了,或者是-XX:-HandlerPromotionFailuer参数没设置,此时就会直接出发一次 FULL GC,就是对暮年月进行垃圾接纳,只管腾出来一些内存空间,然后再执行Minor GC若是上面都判断乐成了。此时进行Minor GC 有几种可能Minor GC 事后,剩余的存活工具的巨细,是小于Survivor区的巨细的,那么此时存活工具进入Survivor区域即可Minor GC事后,剩余的存活工具的巨细,是大于Survivor区域的代销,然则小于暮年月可用内存巨细的,此时是直接进入来年月即可。Minor GC 事后,剩余的存活工具的,大于了Survivor区域的巨细,也大于了暮年月可用内存的巨细。此时暮年月都放不下这些存活的工具,就会发生”Handle Promotion Failure” 的情形,这个时刻就会触发一次 Full GC
JVM内存相关的聚集焦点参数-Xms:java堆内存的巨细:通常情形下 -Xms 和 -Xmx 设置一样
-Xmx: java堆内存的最大巨细
-Xmn: Java堆内存中的新生代巨细,扣除新生代剩下的就是暮年月的内存巨细
-XX:PermSize: 永远代巨细
-XX:MaxPermSize: 永远代最大巨细
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
-Xss: 每个线程的栈内存巨细
工具分配流程
工具接见方式
虚拟机类加载机制什么时刻会把.class
字节码文件加载到虚拟机中?
JVM对class文件是按需加载(运行时代动态加载),非一次性加载,见示例(启动需要加上参数:-verbose:class)
类加载时机
遇到new、getstatic、putstati 或 invokestatic 这4条指令时,若是类没有进行初始化,则需要先触发其初始化。天生者4条指令的java代码场景是: 使用new关键字实例化工具的时刻、读取或者设置一个类的静态字段(被final修饰、已在 编译期把效果 放入常量池的静态字段除外)的时刻,以及挪用一个类的静态方式的时刻;使用java.lang.reflect 包的方式对类的进行反射挪用的时刻,若是类没有进行过初始化,则需要先触发其初始化。当初始化一个类的时刻,若是没有发现其父类还没有进行过初始化,则需要先触发其父类的初始化当虚拟机启动时,用户需要指定一个要执行的主类(包罗main()方式谁人类),虚拟时机先初始化这个主类3.类加载历程
4.类与类加载器 : 类加载器 + 类 = 唯一
5.双亲委派机制
垃圾接纳如何判断工具为垃圾工具
引用盘算法在工具中添加一个引用计数器,当有地方引用这个工具的时刻,计数器 + 1,当失效的时刻,计数器 – 1 可达性剖析法通过一些列的的称为”GC Root” 的工具作为起始点,从这些节点最先向下搜索,搜索所走过的路径称为引用链。当一个工具到GCRoots 没有任何引用链 相连时,则证实此 工具时不能用的
可做为GC Roors的工具:虚拟机栈(栈帧的内陆变量表)中的引用工具,方式区中类静态属性的引用的工具,方式区中常量 引用的工具,内陆方式栈中JNI引用的工具,
一句话总结: 只要你的工具被方式的局部变量、类的静态变量给引用了,就不会接纳他们。
2.垃圾接纳算法
符号祛除
复制
符号整理
分代算法
3.垃圾接纳器
Serial 和 Serial Old 垃圾接纳器
划分接纳新生代和暮年月的垃圾工具。
事情原理: 垃圾接纳的时刻会住手我们自己写的系统的其他事情线程,让我们 系统直接卡死不动,然后让他们垃圾 接纳,这个现在一样平常写后台 java 系统险些不用。
ParNew 和 CMS 垃圾接纳器
多线程接纳垃圾
线程数目: 默认和CPU的核数一样
CMS 是用在暮年月的垃圾 接纳器
CMS(Concurrent Mark Sweep)网络器是一种以获取最短接纳停留时间为目的的网络器。它而异常相符在注重用户体验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发网络器,它第一次实现了让垃圾网络线程与用户线程(基本上)同时事情。初始符号: 符号出来所有GC Roots直接引用的工具并发符号:在运行时代可能会确定新的存活工具,也可能让部门存活工具失去引用,酿成垃圾工具。在并发符号的时刻,系统程序会一直的事情,他可能会种种确定出来新的工具,部门工具可能酿成垃圾。需要对GC Roots进行深度追踪,由于暮年月里存活的工具对照多。重新符号:在第二个阶段,一遍符号存活工具和垃圾工具,一边系统一直运行确定新工具,让老工具酿成垃圾。以是在第二阶段竣事之后,会有许多存活工具和垃圾工具,是之前没有符号出来的并发祛除:并发整理。需要把垃圾工具从种种随机的内存位置整理掉,也是对照耗时的
G1垃圾接纳器
统一网络新生代和暮年月,接纳了加倍优异的算法和设计机制
G1 (Garbage-First)是一款面向服务器的垃圾网络器,主要针对配备多颗处置器及大容量内存的机械. 以极高概率知足GC停留时间要求的同时,还具备高吞吐量性能特征.
特点 :Java堆内存分为多个巨细相等的Region。设置一个垃圾接纳的预期停留时间
监控工具与故障处置工具下令行 工具
jpsjstatjinfojmapjhatjstackhsdis2. jdk的可视化工具
jconsole
visualvm
Arthas:java诊断工具Btrace:故障剖析工具
GC日志和线程GC日志:gceasy
客栈定位:fastthread
如何提高平面设计能力?