浅谈JVM及其性能优化

一、JVM总体结构介绍

1)类加载子系统与方法区:类加载子系统负责从文件系统或者网络中加载class信息,(classloader类加载器就是类加载子系统的一个部件),加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中可能还会存放运行时的常量池信息,包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)。

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

堆空间是所有线程共享的,这是一块与java应用密切相关的内存空间。

3)直接内存:java的NIO库允许java程序使用直接内存。直接内存是在java堆外的、直接向系统申请的内存空间。通常访问直接内存的速度会优于java堆。处于性能的考虑,读写频繁的场合可能会考虑使用直接内存。由于直接内存在java堆外,因此它的大小不会直接受限于Xmx指定的最大堆大小,但是系统内存是有限的,java堆和直接内存的总和依然受限于操作系统能给出的最大内存。

4)垃圾回收系统:垃圾回收系统是java虚拟机的重要组成部分,垃圾回收器可以对方法区、java堆和直接内存进行回收。java堆的垃圾收集器的工作重点,垃圾回收系统会在后台查找、标识并释放垃圾对象,完成包括java堆、方法区、和直接内存中的全自动化管理。

5)java栈:每个java虚拟机线程都有一个私有的java栈,一个线程的java栈在线程创建的时候被创建,java栈中保存着帧信息(一个方法执行到的一个节点),java栈中保存着局部变量、方法参数,同时和java方法的调用、返回密切相关。

6)本地方法栈:本地方法栈和java栈类似,最大的不同在于java栈用于方法的调用,而本地方法栈则用于本地方法的调用,作为对java虚拟机的重要扩展,java虚拟机允许java直接调用本地方法(通常用C编写)。

7)PC(Program Counter):PC寄存器是每一个线程私有的空间,java虚拟机会为每一个java线程创建一个PC寄存器。在任意时刻,一个java线程总是在执行一个方法,这个正在被执行的方法称为当前方法。如果当前方法不是本地方法,PC寄存器就会指向当前正在被执行的指令。如果当前的方法是本地方法,则PC寄存器的值为 undefined。

8)执行引擎:执行引擎是java虚拟机的最核心组件之一,它负责执行虚拟机的字节码,现代虚拟机为了提高执行效率,会使用即时编译技术将方法编译成机器码后再执行。

二、java堆结构及分代

分代为了提高GC效率,分为新生代、老年代、永久代。

Eden:新创建的对象在Eden区,是经常进行GC的区域,也是垃圾收集最主要的区域。

1)新生代:

2)老年代:在新生代中经理了多次GC后仍然存活下来的对象会进入老年代中。老年代中的对象生命周期较长,存活率比较高,在老年代中进行GC的频率相对而言较低,而且回收的速度也比较慢。

3)永久代:永久代存储类信息、常量、静态变量、即时编译器编译后的代码等数据,对这一区域而言,java虚拟机规范指出可以不进行垃圾回收。

三、JVM垃圾回收算法 

1)引用计数(Reference Counting):比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

 2)复制(Copying):此算法把内存空间划分为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另外的一个区域中。复制成本较小,且不会出现碎片。但缺点为需要两倍内存空间

3)标记-清除(Mark-Sweep):此算法分为两个阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用并且会产生内存碎片。

4)标记-整理(Mark-Compact):此算法结合了“标记-清楚”和“复制”两个算法的优点。分为两个阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,清除未标记对象,并且把存活对象”压缩“到堆中的其中一块按顺序排放。避免了碎片问题,也避免了占用空间的问题。

四、JVM垃圾收集器

       如果说垃圾回收算法是垃圾回收的方法论的话,那么垃圾收集器就是对该方法论的具体实现。

Minor GC 与 Full GC的区别:

-------------------------------------------------------------------

在hotspot VM虚拟机中的垃圾收集器有7种,3种进行Minor GC,3种进行Full GC,还有一种能进行Minor GC 也能进行Full GC。

1)串行收集器(Serial)

serial 收集器是 Hotspot 运行在 client模式下的默认新生代收集器,它的特点是只用一个CPU/一条线程去完成 GC 工作,并且在进行垃圾收集时必须暂停其他所有的工作线程(Stop The World ,STW)。可以使用-XX:+UseSerialGC打开。

2)并行收集器(ParNew)

可以看作是Serial的多线程版本,除使用多条线程进行GC外,其他均与Serial一致。并且当VM启用CMS收集器(Full GC)-XX:+UseConcMarkSweepGC的默认Minor GC。

3)Parallel Scavenge收集器

与ParNew类似,Parallel Scavenge也是使用复制算法,也是并行多线程收集器,更注重系统吞吐量。(系统吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间))

停顿时间越短就越适用于与用户交互的程序,良好的响应速度能提升用户的体验;而高吞吐量则适用于后台运算而不需要太多交互的任务

4)Serial Old收集器

Serial Old收集器是 Serial 收集器的老年代版本,同样是单线程收集器,使用”标记-整理算法“。

5)Parallel Old收集器

Parallel Old收集器是 Parallel 收集器的老年代版本,同样是多线程收集器,使用”标记-整理算法“。

6)CMS收集器

CMS(Concurrent Mark Sweep)是一个并发收集器!!!与ParNew、Paraalel Scavenge、Parallel Old收集器不同,最大的区别就是:并发收集器可以使GC线程与用户线程交替执行,而不需要等待GC完毕后再释放安全点去执行用户线程。

7)G1收集器

新生代和老年代都可以使用。

五、JVM优化

jvm小工具:不是第三方插件,是jdk自带的。

1.jps 展示Hotspot vm虚拟机的进程。jps -v或jps -l

2.jstat 查看Hotspot VM运行时信息 命令格式 jstat -gc pid 毫秒 展示的信息数

如图

SOC(survive from创建的空间字节数)  S1C(survive to创建的空间字节数) S0U(survive from使用的空间字节数) S1U(survive to使用的空间字节数)EC(eden区域创建的空间字节数)  EU(eden区域使用的空间字节数)  OC(老年代创建的空间字节数)  OU(老年代使用的空间字节数)  PC(持久代创建的空间字节数)  PU(持久代使用的空间字节数) YGC(young代回收的次数) YGCT(young回收的时间) FGC(老年代回收的次数) FGCT(老年代回收的时间) GCT(回收的总之间)

3.jvisualvm JDK种强大运行监视和故障处理工具,拥有图形化界面。

在jvisualvm中,有一个visualGC插件,可供使用观察垃圾回收器工作状况。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值