【Java 虚拟机】堆/栈

【Java 虚拟机】堆/栈_第1张图片

Java运行时的内存分配策略

静态方法区

  1. 主要存储:静态数据、全局static数据和常量
  2. 这块内存在程序编译的时候就已经分配好
  3. 在整个程序运行期间,都会存在

栈区

  1. 方法体内的局部变量都在栈上创建
  2. 在方法执行结束后,这些局部变量所占内存都会被释放

堆区

又称为动态内存分配区,是指在程序运行时直接new出来的内存,这部分内存在不使用时,就会由Java垃圾回收器负责回收

堆内存/栈内存区别

  1. 在方法体内定义的局部变量(基本类型变量/对象的引用变量),都是在方法的栈内存中分配的。
  2. 堆内存用来存放所有由new创建的对象和数组,其内存回收由Java垃圾回收器负责。

Java内存的回收机制

【Java 虚拟机】堆/栈_第2张图片
不管哪种语言的内存分配方式,都需要返回内存分配的真实地址,也就是返回一个指针,指向内存块的首地址。垃圾回收器为了能够正确释放对象,会监控每一个对象的内存状况,对它们申请、引用、被引用等状况都会进行监控。

如图,在程序运行到第六行时,根据可达性分析,obj2已经不可到达。当垃圾回收器开始工作时,就会将其回收。

Java内存泄漏引起的原因

  1. 什么是内存泄漏?
    不再使用的对象持续占用我们的内存,从而造成内存空间的浪费。内存有时非常不易察觉,这为我们开发留下了隐患。
  2. 内存泄漏的根本原因
    长生命周期的对象持有短生命周期对象的引用可能引起内存泄漏

总结

以上就是我对于Java虚拟机中的“堆/栈”的简单总结,后续还会持续更新迭代。如有任何疑问欢迎留言提问,博主每天都会查看。

你可能感兴趣的:(【Java 虚拟机】堆/栈)