0%

内存分配

内存分配

JVM运行时数据区结构

JVM内存结构

在运行时数据区中的各个结构的生命周期是不同的,有些是随着JVM虚拟机的启动而创建,随着JVM虚拟机的退出而销毁;而有一些是随着线程的创建和结束而进行创建和销毁的。

线程间共享的:堆、堆外内存(永久代、元空间、代码缓存区)

每个线程的:程序计数器、栈、本地方法栈

JVM中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常比堆小,也不会在多个线程之间共享,而堆被整个JVM的所有线程共享

  • 基本数据类型的变量和对象的引用在栈中分配
  • 堆内存用来存放由new创建的对象和数组
  • 类变量,程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中
  • 实例变量 使用new创建对象时,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算出一长串数字以表示这个变量在堆中的物理位置,当实例引用丢失后,将被GC列入可回收名单中,但不会马上释放堆中的内存
  • 局部变量 声明在某方法或某段代码里,执行它的时候在栈中开辟内存,当局部变量一旦脱离作用域,内存立即释放