JVM里面的那些小知识点
Posted java充电站
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM里面的那些小知识点相关的知识,希望对你有一定的参考价值。
1.三种常见的jvm执行模式?
在jvm里面有3中常见的执行模式,分别是解释执行,混合执行,编译执行模式。如果有仔细观察过java -version命令输入后打印出来的内容的话,应该会发现相应的信息:
通过命令窗口里面打印出来的mixed mode可以看见jdk8中默认指定的执行模式为混合模式。另外的两种编译执行,解释执行相比,编译执行的效率要比解释执行的效率高一些,因为解释执行里面每次运行程序都需要将程序转换为字节码,然后通过编译器解释执行所有的字节码,另外一种是暂时保存字节码,以后直接解释保存的字节码即可。
2.请简单说说JIT和动态编译器的区别?
jit编译器是比较古老的一种编译器,当java执行程序时,每当遇到一个类,就需要jit进行一下编译,将其转换为原生码,这样子虽然效率提高了,但是在遇到一些极少遇见的代码时,其相应的效率还是比较低下的。
3.知道有哪些jvm调优工具吗?
例如说jmc调优工具,JMC打开性能日志后,主要包括7部分性能报告,分别是一般信息、内存、代码、线程、I/O、系统、事件。其中,内存、代码、线程及I/O是系统分析的主要部分。
启动JMC后,连接某个本地应用后,出现如下界面:
相应的内存大小,垃圾回收等参数都可以明确通过视图来看到相应指数。
4.jdk里面自带的一些常见命令有哪些?
java -version
java -jar
jps -[qmlv]
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数
jstack jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:
jinfo命令
这条命令可以查看java程序的一些配置参数,结合这里的这张截图,我们来稍微解释一下这里各个参数的含义吧:
1、-Xms:表示java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64大小即可,但仍需按照实际情况进行分配。
2、-Xmx:表示java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4大小。
开发过程中,通常会将-Xms 与-Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。
1、-XX:newSize:表示新生代初始内存的大小,应该小于-Xms的值;
2、-XX:MaxnewSize:表示新生代可被分配的内存的最大上限;当然这个值应该小于-Xmx的值;
3、-Xmn:至于这个参数则是对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置,也就是说如果通过-Xmn来配置新生代的内存大小,那么-XX:newSize = -XX:MaxnewSize = -Xmn,虽然会很方便,但需要注意的是这个参数是在JDK1.4版本以后才使用的。
其实这里只要注意一下,new是指新生代,old是指老年代即可。而CICompilerCount则是值最大并行编译数:这个一般很少会在配置中使用到。
jmap命令
jmap命令可以查看到相应的快照信息属性,这里面的-heap是指堆栈的信息含义。
4.请总结一下垃圾回收的几种算法?
引用计数法(给每一个对象保存一个应用计数,如果计数为0,则将该对象清除。)
缺点:每一次有新的对象进行引用的时候,都需要更新相应的计数。而且无法删除循环引用(例如说两个对象互相引用的时候。)
标记清除法
首先给每个存活的对象进行标记,然后针对那些没有被标记的对象进行删除操作。(分了两个阶段,第一次为从根节点开始寻找被引用的对象并且进行标记,第二个阶段为才开始进行清除)。
缺点:这个算法在执行的时候需要暂停整个应用程序。
复制算法
将内存划分为两个区域,将其中的一个区域里面被引用的对象复制到另一个区域当中,并且进行内存的重新整理!!(防止内存碎片化现象严重)
缺点:需要将内存进行复制,占用内存空间。
标记整理法
这个和标记清楚法有点类似,是先标记具有引用的对象,然后进行对象整理,将其压缩到堆的一块位置,按照顺序排放。
优点:解决了空间不足和内存碎片的两个缺点。
分代收集法
根据jvm里面对象的年代进行回收的算法。
5.JVM里面常见的root对象有哪些?
栈里面的引用对象。堆里面的对象集合(方法区静态引用,常量引用)
6.请简单说说hotspot里面的分代情况?
首先我们需要知道以下hotspot VM被分成了Young Tenured Perm三个阶段。在java的GC发生在年轻代的时候,我们称之为Minor GC,如果发生在老年代,我们则称之为Major GC或者Full GC.
hotspot vm划分为了三个年代Young Tenured Perm年代。(也就是我们常听说的年轻代,老年代,持久代)
7.请简单说下年轻代
年轻代被划分为了Eden区和Survivor区,Survivor区的内存普遍会比Eden区大。当一个对象初次创建的时候会被存放在eden区里面,当年轻代进行垃圾回收的时候,我们称之为Minor GC,这个时候Eden区的对象会被回收(判断是否有其他对象对其做引用)。如果经过了第一次Minor GC该对象仍然没有被回收的话,这个对象就会被转移到Survivor区里面。当然,进入了Survivor区里面之后也是会经历很多次垃圾回收的,每当熬过一次垃圾回收,相应的对象的年龄就会加一,当这个年龄数值超过了相应的阈值之后就会被转移到老年代里面去。
8.进入老年代的条件
1.超级大对象,需要连续的存储空间的对象直接进入老年代里面。
2.在Survivor区里面存活达到一定时间段的对象(经历minor gc 次数超过一定数量)进入老年代。
3.如果Survivor里面所有年龄相同,而且对象大小总和超过Survivor空间一半,则直接进入老年代。
ps:如果从Survivor区进入老年代的对象空间大小总和超过了Survivor空间的一半,则需要进行一次Full GC来释放资源处理。
9.永久代保存了什么信息
这里面主要保存一些Class信息和Meta信息,专门用于进行内存的永久保存处理。但是当过了jdk1.7之后,永久代已经被开发者们移除了,在 JDK 1.8 中, HotSpot 已经没有 “PermGen space”这个区间了,取而代之是一个叫做 Metaspace(元空间) 的东西。
10.请说下STW 机制(Stop the world)
之前我们说过,每一次进行垃圾回收的时候,jvm都会独立开启一个线程来进行回收。当我们需要进行对象内存释放的时候,为了保证计算的准确性,因此jvm需要进入一个短暂的终止阶段。在这个过程里面,jvm会稍微的暂定一小段时间,然后在这一小段时间里面进行一个垃圾回收操作
长按二维码
元旦快乐
大吉大利
以上是关于JVM里面的那些小知识点的主要内容,如果未能解决你的问题,请参考以下文章