面向对象进阶
JVM内存的分配
编译器将.java文件转化为.class文件
.class文件被交给类加载器(三种)----在内存中分配空间
JVM(java虚拟机)会将内存分为5块:
栈:java栈的区域比较小,空间1M,特点:(存取数据)速度非常快,在栈里执行的基本上都是快速任务,存基本数据类型和对象的引用
堆:new出来的对象都存放在堆里面,堆里面的每一个对象都会产生一个唯一的地址,内存地址赋值给栈里面的引用。堆里面的对象需要垃圾回收机制销毁,手动销毁:将目标对象 = null
方法区:称为静态区
-类(class)
-常量
-成员方法 //不需要static声明
-静态方法 //static声明 使方法属于类
-静态变量
被所有线程共享的区域
常量池:存放开发过程中涉及的字面量及常量(String “123”,final 123)
String s = "123"//s存在栈,“123”存在常量池,String是一个对象
int s = 123 //s和123都存在栈中
PC寄存器:用来保存JVM的指令和地址
本地方法栈:主要用来保存native方法进入区域的地址
栈和堆的内容:
栈:栈是一端受限,一端允许操作的线性表。第一个数据从栈顶进入,存放在栈底,称为压栈。取出数据必须从栈顶从上到下取出。
理解:先放进来的数据最后才能取出,后放优先取,栈先进后出的特点LIFO(last in fast out)
-存储数据的两种结构:
-
顺序存储:首先分配一个足够大的数组。控制这个结构,一端进行增删操作,一端不允许操作。让操作的叫栈顶,不让操作的叫栈底。
-
链式存储:采用链表结构,控制入栈和出栈的一个端口。控制一端不能操作。优点:要多少申请多少,但是用完要释放空间
堆:一种经过排序的一种树形的数据结构,对的数据结构指的就是二叉树,堆可以看成一棵树的数组结构。每个节点数据都可以单独取出
内存图