java虚拟机内存区域

1.程序计数器:

    1.1程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的虚拟机字节码的行号指示器,如下图理解:

    1.2:程序计数器处于线程独占区:就是每个程序都会有他自己的程序计数器

    1.3:如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址(如上图的1.2.3.行数,但是不是按照这种形式保存地址),如果正在执行的是native方法,这个计数器的值为undefined。

    1.4:此区域是唯一一个在Java虚拟机规范中没有规定如何OutOfMemoryError情况的区域:由Java内部进行维护的。

    1.5:关于Java中有没有goto.  现在是不能用GOTO的Java中唯一一个保留字。以后可能会用到。


2.Java虚拟机栈:

    2.1Java虚拟机栈描述的是Java方法执行的动态内存模型。

    2.2:栈帧。每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成,用于存储局部变量表,操作数栈,动态链接,方法出口等,如图:

2.3:局部变量表:存放编译期可知的各种基本数据类型,引用类型,returnAddress类型

局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,

方法运行期间是不会改变局部变量表的大小。

2.4:栈内存大小:当进栈的方法过多(如递归调用方法不正确时)就会导致栈溢出而出现StackOverFlowError

如下面的例子:


如果栈的深入不限定大小的话,那就会不停的进栈,比如栈内存大于虚拟机的内存时,就会报出一个OutOfMemory.

可能导致两种溢出,栈溢出或者Java溢出

3:本地方法栈:为虚拟机执行Java方法服务。

4:虚拟机栈:为虚拟机执行Java方法服务。

5:Java堆:存放对象实例,垃圾收集器管理的主要区域,新生代,老年代,Eden空间(后面会详细讲解)

-Xmx -Xms修改堆的大小

6.方法区:存储虚拟机加载的类信息(类的版本,字段,方法,接口 ;执行的方法基本都会放到方法区中)

,常量,静态变量,即时编译后的代码等数据。

    6.1:方法区和永久代 不等价。

    6.2:垃圾回收在方法区的行为:出现比较少,回收比较低一般是对常量池的回收,和对象类型的卸载。

    6.3:异常的定义:在申请内存失败的情况下也会抛出一个:OutOfMemoryError

7:java内存区域--直接内存和运行时常量池

        7.1:常量池是用来存放编译器生成的各种自变量以及符号引用,这部分内容将在内加载后

接入方法区的运行时常量池中存放。下面举个例子



所以字符常量存放的是常量池中,但是当new关键字创建对象的时候,他就不会再去考虑

常量池,而是直接再堆内存开辟一个空间 然后把地址赋给S3所以 S1==S2!=S3

        7.2:直接内存:    NIO中使用。(后面再详细了解)


猜你喜欢

转载自blog.csdn.net/qq_32170289/article/details/81002018