hotspot如何分配内存:


wKioL1VulnOQOc-iAAE2QccI_vI580.jpg

JVM根据java对象存活时间长短会把内存分为3代:

1、年轻代(经常进行内存回收),其中两个存活区总有一个是空白的空间

  1.1:eden区,初始化对象,用完后进行垃圾回收,回收前先把有效的对象根据存活时间复制到空白的                存活区或年老代

  1.2:存活区1,初始化对象,用完后进行垃圾回收,回收前先把有效的对象根据存活时间复制到空白的                 存活区或年老代

  1.3:存活区2,

不需要被调用的对象,比如方法内部新建的区部对象

2、年老代(经偶尔进行内存回收)

还存活的对象

3、永久代(几乎很少进行内存回收)

JVM运行自身需要的类,比如初始化加载的java类



堆内存:存放所有new出来的对象

栈内存: 存放基本类型的变量数据和对象的引用

静态域:存放静态成员(static定义的)

常量池(堆内存上分配的一小块内存):存放字符串常量和基本类型常量(public static final)

方法区:JVM启动后,java类需要加载到内存中,包括属性和方法。eg:定义一个person类,person类中有一个属性age,有setAge方法,当new 3个person对象的时候,会有3套age变量,一套setAge方法。setAge时不同对象调用同样的setAge。


对于字符串:其对象的引用都是存储在栈中的,

如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,

如果是运行期(new出来的)才能确定的就存储在堆中



4:JAVA CLASSLOADER

4.1:Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象

4.2:每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载.

4.3:

image.png


https://blog.csdn.net/briblue/article/details/54973413