天天看点

内存

jvm内存分类

1,方法区 方法区用来存储被虚拟机加载的类信息、静态常量、编译器编译后的代码等数据,方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量,这个区域是所有线程共享的区域,因此,它被设计成为线程安全的,final修饰不可修改

2,堆 堆是虚拟机启动的时候创建的被所有线程共享的区域。这块区域主要用来存放对象的实例,通过new操作创建出来的对象的实例都存储在堆空间中,从JDK1.7开始,字符串常量池已经被移到堆区了

3,虚拟机栈 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用,栈与线程拥有相同的生命周期,当进行方法调用时,通过压栈与弹栈操作进行栈空间的分配与释放。

当一个方法被调用的时候,会压入一个新的栈帧到这个线程的栈中,当方法调用结束后,就会弹出这个栈帧,从而回收掉调用这个方法用的栈空间。 静态常量:对于该类的对象来说,都只有一个,叫类变量 非静态常量:每个该类的对象都各有一个,叫成员变量.

1,在创建对象的时候,需要每个成员变量(非静态)开辟内存空间,类变量(静态变量)则是在类加载的时候就创建好了.

2,用static修饰过的常量会存到常量池里面。存入的方式是:先到常量池里面寻找,看是否该常量已经存在,如果存在返回该常量的引用,不存在就在常量池里面新建一个常量

3,如果没有static修饰,就属于对象的属性,绝大多是对象是存在堆中,也就是如果多个对象存在同样一个常量,在堆中会为每一个对象的该常量分配存储空间。由此可以看出,static修饰后的作用就是减少内存的消耗,常量的存储位置发生了变化 类加载过程

继续阅读