每日一点JVM---Java内存模型

Java内存模型

《Java虚拟机规范》中定义了一种“Java内存模型”(Java Memory Model,JMM)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果

主内存与工作内存

Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量存储到内存和从内存中取出变量值这样的底层细节。
此处的变量与Java编程中的变量不同,它包括了实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,也就不会有竞争问题
Java内存模型规定了所有的变量都要存储在主内存,线程的工作内存除了拥有自己私有的局部变量外,还保存了被该线程使用的变量的主内存副本,线程对变量的操作都必须在主内存进行,而不能直接读写主内存中的数据不同线程间也是隔离的,线程间变量值的传递均需要通过主内存来完成。

栈中和堆中分别存放什么数据

栈(stack)和堆(heap)都是Java用来在Ram中存放数据的地方,与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

在Java中,每个线程都会有自己独立的栈,多个栈中的数据不能共享,具有先进先出的特性。
该区域存放的对象主要为:

  1. 一些基本类型的变量(int,short,long,byte,float,double,boolean,char)和对象句柄(例如:在函数中定义的一些基本类型变量和对象的引用变量)
  2. 方法的形参,直接在栈空间分配,方法调用完回收

每个Java应用对应一个JVM实例,每个JVM实例唯一对应一个堆,应用程序在运行中创建的所有类实例或者数组都放在这个堆中,并由应用所有的线程共享,Java中分配堆内存是自动初始化的。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
主要存放:

  1. 由new创建的对象和数组
  2. this

大对象放在哪个内存区域

堆 此问题没有得出详细答案 还请知道答案的大哥们评论区解惑!

堆区如何分类

Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代老年代永久代(对HotSpot虚拟机而言),这就是JVM的内存分代策略。其实也就是分为Eden、From Survivor和To Survivor,一般是8:1:1的比例。
  新创建的对象会在新生代中分配内存经过多次回收仍然存活下来的对象存放在老年代中,静态属性、类信息等存放在永久代(方法区内)中,新生代中的对象存活时间短,只需要在新生代区域中频繁进行GC,老年代中对象生命周期长,内存回收的频率相对较低,不需要频繁进行回收,永久代中回收效果太差,一般不进行垃圾回收,还可以根据不同年代的特点采用合适的垃圾收集算法。分代收集大大提升了收集效率,这些都是内存分代带来的好处。

猜你喜欢

转载自blog.csdn.net/fucccck_ly/article/details/108229779