浅析Java的底层内存分布

作为一名优秀的程序猿,我们有必要了解一下Java的底层的内存分配以及浅浅的了解一下Java的垃圾回收机制。

本片博客我们主要讲解Java内存中的栈内存,堆内存和方法区这三者。

1:栈内存

栈内存主要存储了我们开的局部变量和方法调用,和引用变量。比如我们写了一个方法,在这个方法和我们的main方法里定义的所有变量以及我们调用的方法都放在栈中。一旦我们离开方法代码的作用域时,我们的栈就会自动回收空间。并且我们new一个数组或者对象,我们用来调用这个数组或者对象的变量我们称之为引用变量(因为new出来的叫做引用数据类型嘛,所以变量叫引用变量也没毛病了),我们的引用变量也存在栈空间里,而我们new出来的具体的玩意则储存在堆内存里。一旦引用变量离开作用域时,也会被系统回收栈空间,但是堆里边的具体存储的数据信息并不会被回收,而是被标记为垃圾数据,但是还可以调用,我们的Java的垃圾回收器会在一个合适的时机来回收掉他,并不会马上回收。

2:堆内存

在栈时我们提到了栈会存储引用变量而堆则开辟位置存储具体的数值。在堆里的数据是由垃圾回收机回收。当我们的引用变量的空间被释放时,我们堆里的数据就没了引用变量指向它,如果我们此时不给它新的引用变量,他就会被标记为垃圾数据,再合适的时候被Java的垃圾回收器回收。但是如果我们给它新的引用变量指向它时,他就不会被回收,这就是我们可以在方法里传会数组类型的原因。

3;方法区

方法区主要存储类的有关信息,比如类的成员变量和成员方法,类的名称、方法信息、字段信息、静态变量、常量以及编译器编译后的代码等。我们自己static修饰的变量,由于它被static修饰过了,所以它就不在单独属于某一个对象。而属于类。随着类的加载而优先加载在jvm加载前,就已经在内存中了,由于它属于类不属于从对象,同时优先其他加载,所以被static修饰过的变量就自动脱离堆与栈保存在存储类的相关信息的方法区了,优先被加载出来。并且由于static修饰得变量或方法属于类级方法与变量,它只能修饰成员方法和成员变量,无法修饰局部变量。

也上就是对三个内存的讲解,如果有错欢迎大佬指出,欢迎大家友善交流。

你可能感兴趣的:(java知识点,java,开发语言,jvm,Java的内存回收机制,底层内存的分配)