JAVA虚拟机初步学习之内存管理分配

来源:互联网 发布:阿里云香港测试ip 编辑:程序博客网 时间:2024/06/05 17:59

前言:

很久不写文章了。进来工作轻松了不少。不之前学习整理的东西共享一下,由于本人技术还有限。有不足之处还希望大家不要见怪!

JVM的架构:

JVM的架构主要分为:方法区,堆,java方法栈,本地方法栈,程序计算器。

方法区和堆的数据是被所以线程共享的,栈和程序计数器的数据是每一个线程自己独立的。




程序计算器:
它是JVM的中一个很小的内存空间。
.class文件存放的字节码的指令器。
作用:
执行字节码指令。 程序的分支,循环,跳转,异常处理,线程恢复等等都依赖程序计算器要完成。
实现原理:
JVM的多线程是通过线程轮流切换分配处理器执行时间来实现的。
特性:
每一个线程都有一个独立的程序计算器。个个线程之间的程序计算器互不影响。
是每一个线程私有的。
程序计数器是不会存在内存溢出的情况的。

JVM栈:
每一个方法执行时JVM都会分配一个独立的内存空间,用于存放局部变量表,操作栈,动态链接,方法出口等。这个线程独立的内存空间称为栈。
方法执行:实际上就是入栈出栈的过程。
作用:
用于存放局部变量表,操作栈,动态链接,方法出口等。服务的对象是java方法。
小知识:JVM除了java方法还有其他方法,例如本地方法(c的方法,c++的方法等)
特性:
1.每一线程私有的内存空间。
2.局部变量表存放的数据时:编译期间可知的八大基本和对象引用类型。特别注意,存放的对象引用不等同于对象本身,存放的可能是对象起始地址的引用指针,也可能是代表对象的句柄
3.编译期间:局部变量表所需要的内存空间就分配完毕了。所以执行这个方法时(运行期间),不会改变局部变量表的大小。但是可以存在动态扩展。(编译期间所以方法所需要的内存空间就分配好 )
4..当动态扩展时,扩展的长度超过了JVM规范允许的长度就会内存溢出。

每次方法调用都会有一个栈帧压入虚拟机栈,操作系统给JVM分配的内存是有限的,JVM分配给“虚拟机栈”的内存是有限的。
如果方法调用过多,导致虚拟机栈满了就会溢出。这里栈深度就是指栈帧的数量。

本地方法栈:
本地方法栈和JVM栈类型。区别是服务对象不一样。本地方法的服务对象是本地方法。常见的本地方法,可以到Objet类中查看一下,例如HashCode方法,wait方法等等。

堆:
作用:
存放对象实例/实例变量和数组的内存空间。
特点:
存储实例变量。
存储对象实例。
堆被所有线程共享资源。
JVM启动就创建了堆。
是垃圾回收器主要处理的空间。
当存储内存量超过可扩展内存,会内存溢出。

方法区:
作用:
存放被JVM已加载的类信息,常量,静态变量,方法,编译生产的代码等。
特点:
被所有线程共享。

运行时常量池:
运行时常量池是方法区的一部分,用于存放编译期间生产的各种字面量(常量)和符合引用。


原创粉丝点击