Jvm体系

转载地址:https://blog.csdn.net/qq_21383435/article/details/80471198

1.JVM体系

Jvm体系_第1张图片
2.JVM存储

Jvm体系_第2张图片

假设1是JVM
2是栈内存
3是堆内存

A和str是存储在栈内存中的。
创建了一个对象,放在堆内存。
栈内存中存储了person对象的引用。(创建的数组也是存放在堆内存中的)
3.概念
3.1 JAVA stack(栈)

    栈也叫内存,是java程序的运行区,是在线程创建时创建,它的生命周期是跟随线程的生命周期,线程结束栈内存也就释放,对于栈来说是不能存在垃圾回收问题,只要线程一结束,该栈就Over.
    栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并且压入栈中,A方法又调用B方法,于是产生栈帧F2也被压入栈,执行完毕后,先弹出F2栈帧,再弹出F1栈帧,遵循“”“先进后出”原则。

    本地变量(Local Variables).:包括输入参数和输出参数以及方法内的变量。
    栈操作(Operand Stack):记录出栈,入栈的操作
    栈帧数据(Frame Data):包括类文件,方法等待。

3.2 JAVA heap(堆)

    一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。
    虚拟机中用于存放对象与数组实例的地方,垃圾回收的主要区域就是这里(还可能有方法区)
    类加载器读取了类文件后,需要把类,方法,常变量放到堆内存中,以方便执行器执行,堆内存分为三个部分

    Permanent Space 永久存储区
    Young Generation Space 新生区(New Generation)
    Tenure Generation Space 养老区(Old Generation)

Jvm体系_第3张图片

这是一个jvm存储区域。
2是我们程序要运行的。

New Generation
又称为新生代,程序中新建的对象都将分配到新生代中,新生代,又由Eden Space和两块Survivor Space构成,可以通过-Xmn参数来指定其大小,Eden Space的大小和两块Survivor Space的大小比例为8(8:1:1),既当NewGeneration的大小为10M时,Eden Space的大小为8M,两块Survivor Space个占用1M,这个比例可通过-XX:survivorRation来指定。

Old Gereration

又称旧生代,用于存放程序中经过几次垃圾回收还存活的对象,例如缓存的对象等,就声带所占用的内存大小即为-Xmx指定的大小减去-Xmn指定的大小。

Permanment Space

一个常驻内存的区域,用于存放JDK自身所携带的Class,interface的元数据,也就说它存储的是运行环境必须得类信息,被装在进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用的内存。
4.分代回收

Jvm体系_第4张图片

6是常驻区域。
1是伊甸区,对象生成后最先放到这里。
2 然后是Survivor区,eden区的对象经过gc后,会放入survivor1区,然后如果survivor1区放满了,就会gc survivor1区,然后把还能活着的对象转移到survivor2区,那么survivor1区剩下的就是不需要的对象了,需要删清理掉的对象。然后把带有对象survivor2与没有对象的survivor1交换,因为gc survivor的时候是对第一个,应该把所有survivor中的对象都gc一次,看看对象是否可以清除。

当我们多次gc的时候,survivor中仍然有对象存活,就将这些数据放到老年代中。如果老年代也存储不下的时候,会触发full gc,这时候就非常耗内存。

老年代

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代中,因此,可以认为老年代中存放的都是一些生命周期较长的对象。

持久代

用于存放静态文件,如今java类,方法等。持久代对垃圾回收没有显著的影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等。在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类,持久代大小通过-XX:MaxPermSize=进行设置
5.堆设置

-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小。
-XX:NewRation=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4。
-XX:SurvivorRation=n:年轻代中Eden区与Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=-3:2,一个Survivor区占整个年轻代的1/5.
-XX:MaxPermSize=n:设置持久代的大小。
---------------------  
作者:九师兄-梁川川  
来源:CSDN  
原文:https://blog.csdn.net/qq_21383435/article/details/80471198  
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(jvm,堆,Java)