JVM相关知识

1.什么是JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行

2:JRE/JDK/JVM是什么关系

JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。

JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。

JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

3. JAVA 创建对象在JVM中的工作过程(new)

   1. jvm 首先会检查类是否在常量池中存在,要创建对象的类是否已经加载,没有加载就会先加载类

   2. 为对象在堆上分配内存区域

   3.位分配到内存空间的赋初始值0,(这就是全局变量没有不要设初始值的原因)

   4.为对象进行必要的初始化设置,如:对象属于哪个类,类的元数据信息,对象的哈希码值,对象的GC年代信息,

   5.执行init方法

4.对象的内存布局

   对象在内存中存储分为3块区域:对象头,实例数据,对齐填充。(注:对象头的另外一部分是类型指针,是对象指向他的类元数据的指针,虚拟机通过类型指针来确定对象是哪个类的实例)

5. GC算法

判断对象是否存活一般有两种方式:

引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。

可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。

 

 

查看JVM垃圾回收机制命令:

 

cmd执行命令:

java -XX:+PrintCommandLineFlags -version

 

垃圾收集算法:

  1. 标记-清除算法: 对需要回收的对象进行标记, 之后同意回收。(效率不高,会产生大量碎片)

 

  2.复制算法: 它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉(这种算法的代价是将内存缩小为原来的一半,持续复制长生存期的对象则导致效率降低。)

 3.标记压缩算法

  根据老年代的特点,有人提出了另外一种“标记-整理”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

     

4.分代收集算法

GC分代的基本假设:绝大部分对象的生命周期都非常短暂,存活时间短。

“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

 

垃圾收集器

1. 串行收集器

  串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收  参数控制:-XX:+UseSerialGC

2.并行收集器

  多线程并发收集    参数控制  -XX:+UseParNewGC 并行收集器    -XX:ParallelGCThreads 限制线程数量

3.平行收集器

  更关注系统的吞吐量。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例     参数控制:-XX:+UseParallelGC 

4.Parallel Old 收集器

   使用多线程和“标记-整理”算法。这个收集器是在JDK 1.6中才开始提供    参数控制: -XX:+UseParallelOldGC 使用Parallel收集器+ 老年代并行

5.cms收集器

   优点:并发收集、低停顿 

   缺点:产生大量空间碎片、并发阶段会降低吞吐量

  

   参数控制:-XX:+UseConcMarkSweepGC  使用CMS收集器

             -XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长

            -XX:+CMSFullGCsBeforeCompaction  设置进行几次Full GC后,进行一次碎片整理

            -XX:ParallelCMSThreads  设定CMS的线程数量(一般情况约等于可用CPU数量)

http://www.cnblogs.com/ityouknow/p/5614961.html

 

6.G1收集器

 

 

原文地址:https://www.cnblogs.com/interfacehwx/p/6669692.html