jvm基本信息

jvm的组成结构

 

jvm基本信息

 

1.类加载子系统:

负责从文件系统或者从网络中加载Class信息(二进制文件)加载的信息存放在一块称之为方法区的内存

2.方法区:

就是存放类信息 ,常量信息,常量池信息包括字符串字面量和数字常量等。

3.java堆:

在java虚拟机启动的时候建立java堆 ,它就是java程序最主要的内存工作区域 几乎所有的对象实例都存放在java堆中, 堆空间是所有线程共享的。

4.直接内存:

java的NIO库允许java程序使用直接内存,从而提高性能,通常直接内存的速度会优于java堆 读写频繁的场合可能会考虑使用。

5.java栈:

每个虚拟机线程都有一个私有的栈,一个线程的java栈在线程创建的时候被创建,java栈中保存着局部变量,方法参数,同时和java方法的调用、返回密切相关。

6.本地方法栈:

本地方法栈和java栈非常类似,最大的不同为本地方法栈用于本地方法调用 java虚拟机允许java直接调用本地方法。

7.垃圾回收系统:

垃圾回收系统是java的核心 也是必不可少的,java有一套自己进行垃圾清理的机制 ,开发人员无需手工清理。

8.PC寄存器(程序计数器):

寄存器也是线程私有的空间 ,java虚拟机会为每个线程创建PC寄存器,在任意时刻,一个java线程在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,PC寄存器就会指向当前正在被执行的指令。如果当前方法是本地方法,那么PC寄存器的值就是undefined,寄存器存放当前执行环境指针,程序计数器,操作栈指针,计算的变量指针等信息。

9.执行引擎:

虚拟机最核心的就是执行引擎了,他负责将虚拟机的字节码转换成机器吗,现代虚拟机为了提高执行效率,会使用即时编译技术将方法编译成机器码后再执行。

垃圾回收算法:

程序计数器,虚拟机栈,本地方法3个区域随线程而生,随线程而灭。垃圾收集器主要关注于Java堆和方法区。

1如何判断对象是否存活:

引用计数算法:

在对象中添加一个引用计数器。被一个地方被引用就加。小于1时就可以回收了。不过对于循环引用难以区别,

可达性分析计算:

使用一系列的GC Roots的对象(包括以下必须存在的基本类),向上找引用。判断对象是否可以回收。引用的四种概念:强引用,软引用,弱引用,虚引用。

2垃圾回收算法:

复制算法:

先将存活数据复制到一个指定区域,在对其他地区进行清除。

新生代到老年代的算法:

经过一个复制算法对象年龄就会加一,加到15了对象会被放入老年带。

标记-清理与标记-整理算法:

标记-清理:对付老年代空间的,先标记在统一清理。标记-整理:让存活的聚齐在一起,清理掉边缘的。

3内存设置参数:

-Xms:初始堆大小,JVM 启动的时候,给定堆空间大小。

  -Xmx:最大堆大小,JVM 运行过程中,如果初始堆空间不足的时候,最大可以扩展到多 少。

  -Xmn:设置年轻代大小。整个堆大小=年轻代大小+年老代大小+持久代大小。持久代一 般固定大小为 64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大, Sun 官方推荐配置为整个堆的 3/8

  -Xss:设置每个线程的 Java 栈大小。JDK5.0 以后每个线程 Java 栈大小为 1M,以前每 个线程堆栈大小为 256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减 小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成。

  -XX:NewSize=n:设置年轻代大小

  -XX:NewRatio=n:设置年轻代和年老代的比值。如: 3,表示年轻代与年老代比值为 1 3,年轻代占整个年轻代+年老代和的 1/4

  -XX:SurvivorRatio=n:年轻代中 Eden 区与两个 Survivor 区的比值。注意 Survivor 区有两个。 如:3,表示 EdenSurvivor=32,一个 Survivor 区占整个年轻代的 1/5

  -XX:MaxPermSize=n:设置持久代大小 

-XX:MaxTenuringThreshold:设置垃圾最大年龄。如果设置为 0 的话,则年轻代对象不经 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代 的存活时间,增加在年轻代即被回收的概率。

 

Java垃圾收集器

新生代收集器:SerialParNewParallel Scavenge

 老年代收集器:Serial OldParallel OldCMS

 整堆收集器:G1

1. Serial 收集器 串行

  针对新生代;

  采用复制算法;

  单线程收集;

  进行垃圾收集时,必须暂停所有工作线程,直到完成( 即会"Stop The World);

在单个CPU的环境下,效率最高。

2. ParNew收集器 并行
ParNew收集器是Serial的多线程版本。一般运行在Server模式下首先的新生代收集器。 Server模式下,ParNew收集器是一个非常重要的收集器,因为除Serial外,目前只有它能与CMS收集器配合工作;

3. Parallel Scavenge收集器

parNew收集器相似,新生代收集器,采用复制算法,多线程收集。

不同的在于,他更注重吞吐量,争取尽量小占用运行时间。比较适合后端运算比较多的服务。

4.Serial Old收集器 串行

单线程串行的老年代收集器。

5. Parallel Old 收集器 并行

使用标记-整理的算法。该收集器比较适合和Parallel Scavenge收集器进行组合。-XX:+UseParallelOldGC

  针对老年代;

      采用"标记-整理"算法;

      多线程收集;

6. CMS收集器

有点:获取较短垃圾回收停顿时间。并发收集、低停顿

一般CMS是老生代收集器和perNew进行组合。

应用场景:

与用户交互较多的场景:

希望系统停顿时间最短,注重服务的响应速度,

wed,B/S系统的服务器上的运用。

7,G1收集器:

有点:并行与并发。分代收集。结合多种垃圾收集算法,空间整理,不产生碎片。可预测的停顿,优先回收价值高的对象。更像标记整理。

应用场景:面向服务端应用,针对具有大内存,多处理器的机器。在应对大堆时效率更高。

主要用来替代:cms收集器。

"-XX:+UseG1GC":指定使用G1收集器;

 

 

 

 

参考博客:

https://blog.****.net/qq_41799291/article/details/87536025(结构)

https://www.cnblogs.com/brxHqs/p/9605757.html(垃圾收集器)