JVM 内存模型

163 阅读2分钟

概述

Java内存的管理一般都是交给JVM管理的,java的内存泄漏在进程重启后也就恢复了,不像C或C++需要重启设备才能恢复。理解JVM的内存模型能帮助开发者做出性能更好的应用是有很大的帮助的;

Java内存模型

Java内存模型

  • Java 虚拟机栈

虚拟机栈是线程的私有内存,它的生命周期与线程一致。每个方法在执行的时候都会创建一个栈帧(stack frame)用于存储局部变量表、操作数栈(操作栈)、动态链接、方法出口等信;

局部变量表存放了编译期间可知的个中数据类型(boolean、char、shrot、int、long、float、double)、对象引用和返回地址。其中long和double为64位的数据类型占用了2个栈容量;

如果请求的栈深度大于虚拟机允许的深度会抛出StackOverFlowError;如果虚拟机制允许动态扩展在扩展是无法申请到足够的内存会抛出OOM。

  • 本地方法栈

基本上和虚拟机栈相同,他们的区别不过时一个执行的是Java方法一是执行的是Native的方法服务。它也会抛出StackOverflow和OOM。

  • Java堆

Java虚拟机管理的内存中最大的一块。Java堆内存共享的一块内存区域。堆内存是虚拟机启动时创建的。此内存的功能就是存放对象实例,几乎所有的对象实例都是内在这个内存空间里面; Java 堆是垃圾收集管理器管理的主要区域,又称做GC堆。堆内存可以细分为新生代和老年代;新生代又可细化为:Eden、From Survivor、To SurVivor空间等; Java 堆可以处于物理上不连续的内存空间中只要逻辑上是连续的即可。在实现时,既可以实现固定大小的,也可以是扩展的(通过-Xmx和-Xms控制)。如果在堆内存中没有内存完成实例分配且也没有足够的空间扩展时会抛出OOM;

  • 方法区

方法区跟堆内存一样是线程共享的。它存储被 Java 虚拟机加载的类信息、常亮、静态变量、即时编译器编译后的代码信息。在内存分配无法得到满足时将抛出 OOM ;

  • 运行常量池

运行时常量池是方法区的一部分。在class文件加载后将存放class文件的版本、字段、方法、接口等描述信息和常量池。