Java内存

java基础

**

Java内存

**

Java内存是我们对Java虚拟机(JVM)研究的开始,也是前期的重难点。

Java内存

      此部分及之后的几篇博客可以参考《深入理解Java虚拟机》一书,这里简单介绍。

Java运行时数据区——五大区块

Java内存

1、Java虚拟机栈

    Java方法执行的内存模型

    方法执行的时候同时创建一个栈帧

也就是说这里是用来存储局部变量、方法的地方

2、本地方法栈

    Native方法储存位置

3、程序计数器

    程序计数器是用来对当前程序计数,方便程序方法代码间的跳转

4、Java堆

    内存最大的区域、也是垃圾收集器管理的主要区域,俗称"GC堆"。

堆空间本是全部对象及数组的实例,但不绝对(栈上分配、标量替换)

5、方法区

    存储一已加载的类信息、常量、静态变量

    运行时常量池(方法区的一部分):编译器生成的各种字面量(常量 final、字符串)和符号引用。

符号引用:

    1>类和接口全限定名

    2>字段的名称和描述符

    3>方法的名称和描述符

注意重点

    123是线程私有空间,45是线程共享空间

Java内存

    还有一个不是运行时数据区的为直接内存

存储

栈区存储

    栈区reference中存储指向对象的引用(并未定义引用如何定位)

一般的两种定位:

    1>句柄访问

Java内存

    2>直接地址

内存溢出

OutOfMemoryError

heap(堆):

    1>Memory Leak内存泄露

    2>Memory Overflow内存溢出

stack(栈):

    1>*Error 栈区内存不够申请的空间(单线程常见)

    1>OutOfMemoryError 虚拟机扩展无法申请到足够的空间

这里作为了解,并不要求特别深入。

谢谢观看!!!