JAVA虚拟机内存分配

在Java虚拟机中,内存被分为三个部分,分别为虚拟机栈,堆内存,和方法区。其中,虚拟机栈和方法去又分为两部分,分别为本地和虚拟机内部。本地栈和方法区用于调用底层接口进行计算时使用。

堆,方法区,栈的介绍
堆(线程共享):

Java堆是虚拟机内存中最大的一部分,也是我们在进行gc时候的区域。该部分用于存储我们在创建对象后的对象。具体的来说,这里存储的内容包括对象头,对象的字段(属性)信息。
对象的头信息中包括 对象头中的内容包括:
Mark Word (标记信息用于确定当前对象的状态)
Class Meta address
Arraylength(数组的长度)
synchronized锁的标记状态及存储在MarkWord中

Bitfields

Tag

State

Hashcode

Age

0

01

Unlocked

(未锁定)

ThreadId

Age

1

01

Biased/biasable

(偏向锁)

Lock record address

00

Light-weight locked

(轻量级锁)

Monitor address

10

Heavy-weight locked

(重量级锁)

Forwarding addresss,etc

11

Marked for GC

(markword长度由造作系统决定,如果操作系统为32位则长度为32.如果操作系统为64位则长度位64.)
对象的回收
根据引用的可达性可分为强引用,弱引用,软引用,和虚拟用。
强引用
我用正常new出来的对象及强引用对象。这部分引用的对象是我们告诉虚拟机不可回收的,因此,当强引用把虚拟机堆内存占满时,就算抛出Outofmemory也不会对该对象进行回收。
软引用
这部分引用一般用于对我们很重要,但是也不是必不可少的。类似于浏览器中的后退按钮,它通过软引用保存了前一个浏览的信息。但是当超过一定的数值任然会自动删除。当这部分数据存在的时候,可以让我们的使用更加方便,但是为了大局考虑,当我们的内存将会导致系统崩溃的时候,它允许gc对该部分信息进行回收。
弱引用
弱引用的存在应该说是更加悲催的,因为他连最基本的人权都没有,只要gc这个警察在他的身边走过,那对不起,兄嘚,拜拜了。
虚引用
虚引用可以理解为,这个人已经被警察抓走枪毙了,他已经不存在于这个世界,但是有时候我们却还有用这个人的名字进行一些操作,比如销户。虚引用及只存在名字的对象了

在经过gc的一次次惨绝人寰的扫荡之后,java的堆内存也分出了三六九等。分别为老年代,新生代,其中新生代又分为(edn,s1,s2)。在老年代中gc使用的是标志整理的方法进行清理,在新生代则使用复制删除的方法。

方法区(线程共享):

emm,方法区这个东西应该说是数据的仓库?在这里,存储着我们将要操作的数据。包括类的中的信息和静态变量,常量,编译后的代码。以及指向类的引用。

栈(线程私有):

栈是一个先进后出的数据结构,因此,他适合做一些数据的操作,比如我们常做的加减乘除。我们将需要操作的数据put进栈中,需要时进行push,从而获取.
比如5+2+6=?这个操作中,会先将5压入栈中,之后读取加号,读取到2push出5进行加法运算,把7压入栈,扫到加号,出6,执行加法。
栈中存储着,局部变量表,操作数栈,动态链接,方法返回地址,以及附加信息等。

程序计数器:

用于记录当前程序执行到哪里