jvm详解

一、jvm结构

1、java虚拟机基本结构

在这里插入图片描述

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

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

3、直接内存:java中的NIO(同步非阻塞I/O)库直接使用内存。直接内存是java堆为的空间,直接向系统申请的内存空间,访问速度会比java堆快。频繁读写操作的场景,会考虑使用直接内存。直接内存大小不受限与jvm,直接映射物理地址,受限于系统内存。

4、垃圾回收系统:垃圾回收系统是java虚拟机的重要组成部分。垃圾回收器可以对方法区,java堆,直接内存进行回收。和c/c++不同,它没有free()或者delete()方法去释放指定的内存区域。对应哪些不使用的对象,会默默标记,并释放,会自动化管理。

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

6、本地方法栈:本地方法栈和java栈非常类似,最大的不同在于java栈用于java方法调用。而本地方法栈则调用的是本地(native)方法,为了扩展java虚拟机的使用,允许直接嗲用本地方法(本地方法通常使用c编写)

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

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

Java HotSpot client VM(-client), 为在客户端环境中减少启动时间而优化。

Java HotSpot ServerVM(-server),为在服务器环境中最大化程序执行速度而设计。

2、jvm堆结构图及分代

有关新生,老年代,永久代详解参考

在这里插入图片描述

java堆内部进行了不同划分,目前分为新生代(Young)、老年代(old)、永久代(permanent).

垃圾回收按分代不同,选择不同大垃圾回收法。新生代指定一个垃圾回收,old,permanent指定一个垃圾回收。

1、新生代(Youg Generation)

新生代的对象存放在新生代,新生代中的对象,存或效率低,一般应用进行一次垃圾收集会回收70%~95%的空间。回收效率很高。

新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比例为(8:1:1),这个比例也是可以修改的。通常情况下,对象主要分配在新生代的Eden区上,少数情况下也可能会直接分配在老年代中。Java虚拟机每次使用新生代中的Eden和其中一块Survivor(From),在经过一次Minor GC后,将Eden和Survivor中还存活的对象一次性地复制到另一块Survivor空间上(这里使用的复制算法进行GC),最后清理掉Eden和刚才用过的Survivor(From)空间。将此时在Survivor空间存活下来的对象的年龄设置为1,以后这些对象每在Survivor区熬过一次GC,它们的年龄就加1,当对象年龄达到某个年龄(默认值为15)时,就会把它们移到老年代中。

2、老年代(Old Generation)

在新生代中经历多次GC后任然存货活下来的对象会进入老年代,老年代中的对象生命周期比较上,存活率比较高。该老年代中回收频率较低,回收也比教慢。

3、永久代(Permanent Generation)

jdk8.可能已近没有永久代一说。可以不深入研究。

二、jvm垃圾回收算法及收集器

1、垃圾回收算法

有关垃圾回收算法大家可以去研究一下,这里我给出这个算法

1、引用计数

2、复制(重点)

3、标记-清除(Mark-Sweep)(重点)

**4、标记-整理(Mark-Compack):**是对标记清除算法的优化,标记清除+复制

2、垃圾收集器

Scavenge GC(次收集)和 Full GC (全收集)

新生代GC(Scavenge GC):新生代中的java对象,操作频繁,回收速度比价快,当Eden空间不足以为对象分内存时,就会触发 Scavenge GC不会影响到老年代。

Fulnl GC:老年代收集器,往往一次FUll GC 都会伴随着已经有Minor GC 执行。总是滞后于次收集。

3、分代收集器

在这里插入图片描述

1、新生代收集器

1、serial:单线程,串行收集器。工作时,其他线程暂停工作。

2、Parnew : 并行收集器。在多核cpu下能体现其优势。

3、Parallel Scavenge收集器:是使用复制算法,并行多线程收集器。

2、老年代收集器

1、Serial old : 老年代,没有复制空间,所以不能使用复制算法。,使用整理标记算法。

2、CMS收集器:并发,可以和用户线程交替执行。带Paralle的都是并行收集器。是收集线程并行运行。

3、Parallel odl:Paralle Scavenge老年版。

三、jvm优化

1、jvm小工具

jvm小工具

2、jvm参数介绍

参数介绍

3、常见配置

参考

4、调优总结

年轻代大小选择:

  • 响应时间优先应用:尽可能设大,直接接近系统的最低响应时间限制。
  • 吞吐量优先的应用:尽可能设置大,可能到达Gbit的程度。
  • 响应时间优先的应用:老年代使用并发收集器。
  • 吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的老年代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值