Java 内存结构

  • Post author:
  • Post category:java




1、Java 内存结构

在这里插入图片描述

在这里插入图片描述



1.1、Java 内存模型




由线程共享,存放 new 出来的对象,是垃圾回收器的主要工作区域。




线程私有,分为 Java 虚拟机栈和本地方法栈,存放局部变量表、操作栈、动态链接、方法出口等信息,方法的执行对应着入栈到出栈的过程。


方法区

线程共享,存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等信息,JDK 1.8 中方法区被元空间取代,使用直接内存。


本地方法栈

:Native关键字,凡是被Native修饰的方法,都会去调用底层的C语言的库,会调用JNI接口(本地方法接口),比如,java驱动打印机打印

​ JNI的作用,就是为了拓展java的使用,融合不同的语言为java所用

在这里插入图片描述



1.2、堆和栈的区别


栈与堆

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


Java的堆。一个JVM只有一个堆内存

,而栈是线程级的,即每个线程都有一个属于自己的栈,且是私有的。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

栈有一个很重要的特殊性,就是存在栈中的数据可以共享



1.3、了解jvm吗,说一下成员变量在jvm的存储

在这里插入图片描述



1.4、对象在堆中的生命周期:

在这里插入图片描述

年轻代回收的步骤:

1,在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。

2,紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,(,每次GC,Eden都会是空的,且谁空谁是To)

3,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。

年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。

4,经过这次GC后,Eden区和From区已经被清空。

这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。

不管怎样,都会保证名为To的Survivor区域是空的。

5,Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

————————————————

版权声明:本文为CSDN博主「Rhenic」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_45912388/article/details/124614929