运行数据区域(Runtime Data Area)组件:运行数据区是整个jvm的重点,我们所有写的程序都被加载到这里,之后才开始运行,java生态系统如此的繁荣,得益于该区域的优良自治。 类加载器(Class Loader)子系统:堆装载.class文件的内容到Runtime data area 中的method area(方法区域) 执行引擎(Execution Engine)子系统:执行引擎也叫做解释器(Interpreter),负责解释命令,提交操作系统执行。 本地接口(Natice Interface)组件:本地接口的作用是融合不同的编程语言为java所用,初衷是融合C/C++程序。目前该方法使用的是越来越少了,除非是与硬件有关的应用.
jvm内存分代策略 JVM内存分代策略:根据对象存活的周期不同,把堆化成年轻代(Young Generation Space)、年老代(Tenured Generation)。年轻代朝生夕死,存活周期短;年老代:一些活跃的对象,回收多次后依然是活的会移到老年代(在年轻代经历15次gc)
为什么要分代:堆内存是虚拟机管理的内存中最大的一块,也是垃圾回收最频繁的一块区域,我们程序所有的对象实例都存放在堆内存中,给堆内存分代是为了提高对象内存分类和垃圾回收的效率。试想一下,如果堆内存没有区域划分,所有的新创建的对象和生命周期很长的对象放在一起,随着程序的执行,堆内存需要频繁的进行垃圾收集,而每次回收都要遍历所有对象,遍历这些对象所需要花费的代价是巨大的,会严重影响我们的GC效率。
年轻代:Young Generation Space: 所有新生成的对象优先放在新生代中(大对象除外,大对象直接放在年老代),新生代对象朝生夕死,存活率很低,在新生代中,常规应用进行一次垃圾回收一般可以回收70%-95%的空间,回收效率很高 在年轻代中经历了N次垃圾回收后仍然存活的对象,就会复制到年老代中,因此,可以认为老年代中存放的都是一些生命周期较长的对象 Full GC 会对年轻代、年老代和持久代一起GC,且此时应用无法响应用户请求,所以FUllGC回收成本高,应用应该避免频繁FullGC
方法区(Method Area):类加载子系统负载从文件或者网络中加载class信息,加载的类信息被保存在方法区的内存空间中,除了类信息外还会保存常量池信息,JDK8之前方法区的实现是被称为一种永久代的区域,这部分使用JVM内存,但是JDK8的时候便移除了永久代(Per Gen)转而使用元空间(MetaSpace)的实现。而且很大的不同就是元空间不在公用JVM内存,而是使用的系统内存。 堆区是JVM中最大的内存区域,存储着各类生成的对象、数组等。这块区域也是线程共享的,堆区被细化可以分为年轻代、老年代,而年轻代又可以分为Eden区、From Survivor、To Survivor三个区域,堆内存的大小是可以调节的,也是gc主要的回收区
VM stack(虚拟机栈):描述的是Java方法执行的内存模型,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束,该栈就Over,栈用于存储栈帧信息、局部变量表、方法出口等信息 Native Method Stack(本地方法栈):与虚拟机栈所发挥的作用非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法也就是字节码服务,而本地方法栈则是为虚拟机使用到的Native方法服务,完成与操作系统的交互 PC Register 程序计数器:是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器,每条线程都需要有一个独立的程序计数器,各条线程之间的计数互不影响,独立存储,我们称这类内存区域为线程私有的内存
名词解释:1. Garbage Collections 字面意思是垃圾回收器,释放垃圾占用的空间。
GC的作用: 让创建的对象不需要像c、c那样delete、free掉 。对于c、c的开发人员来说内存是开发人员分配的,也就是说还要对内存进行维护和释放。 对于Java程序员来说,一个对象的内存分配是在虚拟机的自动内存分配机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄露和内存溢出问题,但是,如果出现了内存泄露和内存溢出问题,而开发者又不了解虚拟机是怎么分配内存的话,那么定位错误和排除错误将是一件很困难的事情。
GC工作原理: 当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”(内存溢出)的错误,Java应用将停止
使用jps查看进程ID 使用命令: jstat -gcutil pid interval(ms) S0: 新生代中Survivor space 0区已使用空间的百分比 S1: 新生代中Survivor space 1区已使用空间的百分比 E: 新生代已使用空间的百分比 O: 老年代已使用空间的百分比 YGC: 从应用程序启动到当前,发生Yang GC 的次数 YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】 FGC: 从应用程序启动到当前,发生Full GC的次数 FGCT: 从应用程序启动到当前,Full GC所用的时间 GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】
内容来源于网络,如有侵权,请联系作者删除!