hotspot如何分配内存:
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:
https://blog.csdn.net/briblue/article/details/54973413
转载于:https://blog.51cto.com/jun123/1657846