jvm内存管理

 

这是我这周整理的jvm内存管理相关的资料,共同学习

一, JVM 综述

JVM 主要包括两个子系统和两个组件。两个子系统分别是Class Loader 子系统和Execution engine (执行引擎)子系统。两个组件分别是Runtime Data Area 组件和Native interface (本地接口)。

Class Loader 子系统的作用:根据全类名来装在class 的内容到Native Method Area 区域。

Execution engine 子系统的作用:执行class 中的指令。

Native interface :与native library 进行交互,是其他语言交互的接口。

Runtime Data Area 组件:这就是我们常说的JVM 内存了。它主要由五部分构成,分别是:

1Heap (堆):一个Java 虚拟机实例只有一个Heap

2Method Area (方法区域):被装载的class 信息存储在Method Area 内存区域中。当虚拟机装载某个类是,它使用classloader 定位到这个类,并把这个类装载到Method Area 。注:Method Area 就是永久存储区(Permanment Space ),它是JVM 的驻留内存。另外被装入此区域的数据是不会被垃圾回收器回收掉的,关闭JVM 时,此区域的内存被回收掉。

3Java Stackjava 的栈)

4Program Counter (程序计数器):总是指向将要被执行的下一条指令的地址

5Native Meghod Stack (本地方法栈)

以上五部分是有HeapNative Meghod Area 是被所有线程共享的,而其他三个是以线程为颗粒度的,每个线程都有自己的部分。

二,永久存储区( Permanment Space )和堆空间( The Heap Space

永久存储区 :就是Method Area 。是jvm 的驻留内存。被装进此区域的数据是不会被垃圾回收器回收的,当关闭jvm 时,释放此区域的内存。如果有些应用是动态生成或者调用某些class ,例如Hibernate 等,这时就有必要设置一个比较大的持久代空间来存放这些类。持久代大小可用 -XX:MaxPermSize= 进行设置。

堆空间( Heap Space :是java 对象生死存亡的地方,java 对象的出生,成长和死亡都在这个区域进行。堆空间又根据java 对象的创建和年龄特征分为新生区(Young generation space )和年老区(Old generation space )。

新生区( Young Generation space :新生区的作用包括对象的创建和率选出能够进入年老区的对象。新生区又包括伊甸园(Eden space ),幸存者0 区(Survivor 0 space )和幸存者1 区(Survivor 1 space )。

伊甸园( Eden space Java 空间所有的对象都在此产生。创建对象的依据就是永久存储区的元数据。

幸存者 0 区( Survivor 0 space )和幸存者 1 区( Survivor 1 space ): 当伊甸园空间用完时,此时 Java 空间又要创建对象;此时垃圾回收器将对伊甸园区的对象进行回收,将伊甸园区中不被其他对象引用的对象进行销毁,释放空间。同时将伊甸园中没有被销毁的对象移到幸存者 0 区,此时如果幸存者 0 区也没有足够的空间来存放这些对象,那么 jvm 的垃圾回收器将对幸存者 0 区进行垃圾回收处理,将幸存者 0 区幸存下来的对象移动到幸存者 1 区。当幸存者 1 区的空间也满的时候,垃圾回收器将对幸存者 1 区进行垃圾回收,此时从幸存者 0 区复制过来的并且存活的对象复制到年老区( Old Space )。需要注意的是: Survivor 的两个区是对称的,没有先后关系 ,所以同一个 Survivor 区内可能同时存在从 Eden 复制过来的对象,和从前一个 Survivor 区内复制过来的对象,而复制到年老区的对象只有从第一个 Survivor 区复制过来并且存活的对象。 而且,总有一个 Survivor 对象是空的。

年老区: 用来保存从新生区存活下来的对象,这些对象一般是生命周期很长的对象。如果年老区没有足够的空间存放 java 队形,则垃圾回收器将对年老区进行垃圾回收。(如果对象仅仅被一个没有被其他对象引用的对象引用,那么该对象也被归为没有存在的必要,以此类推)。如果到最后养老区,幸存者 1 区,幸存者 0 区和伊甸园区都没有空间的话,则 JVM 会报告“ JVM 堆空间 溢出( java.lang.OutOfMemoryError: Java heap space )”,也即是在堆空间没有空间来创建对象。

通常大家还会遇到另外一种内存溢出错误“永久存储区溢出(java.lang.OutOfMemoryError: Java Permanent Space )”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值