今天又看了一些纯文字难理解的东西~不过还好啦,看过第二遍的时候就有了一个能记住的大概顺序~~
记录一下:java虚拟机的内存分区:
JAVA虚拟机在执行JAVA程序的过程中会把他管理的内存划分为若干个不同的数据区域,
一共有6个区域分别是:程序计数器,Java虚拟机栈,本地方法栈,java堆,方法区。
首先可以分为两个大的部分:
1:线程共享的内存区:java堆,方法区。
2:线程私有的区域:程序计数器,java虚拟机栈,本地方法栈。
网上有一张图描述的很清楚
这个图很清楚了吧,然后仔细理解理解每个部分到底放了什么
是干什么的:
先从线程私有的部分看
(1)程序计数器
是一块较小的内存空间,他是线程私有的,每一个线程都拥有自己的程序计数器,是当前线程所执行的字节码的行号指示器,
理解就是程序执行的步骤顺序一步一步,这一步走了
下一步该执行什么 就是在这个程序计数器里面存放的数据决定的
(2)java虚拟机栈
java虚拟机栈也是线程私有的,他的生命周期与线程相同,线程中每个方法在执行的时候都会生成一个栈帧(一种数据结构)里面存了一系列这个方法包含的信息,一个方法从调用到执行完成的过程,就是这个栈帧入栈再出栈的过程, 注意我们平时常说的 栈 指的就是这个栈
(3)本地方法栈
书上解释是和java虚拟机栈相同只不过这个本地方法栈中存放的是一些Native方法,至于native方法是什么我也不太清楚现在。
下来就是线程共享的部分了
(1)java堆
java堆的内存是很大的一块,
所有线程共享这个部分内存,他也可以处在物理上不连续的内存空间中只要在逻辑上是联系的就可以 只不过比较零碎,
这里面放的是我们所有new出来的对象,当然当内存不足的时候,会抛出OOM,
从内存回收的角度来说,又分为新生代和老年代,分这个的目的,就是为了更好的管理内存,那么GC主要管理的也是这里。
(2)方法区
存储着已经被虚拟机加载的类信息,常量,静态变量,等一些数据,对啦GC也关注了这部分的内存,还有就是有一个运行时常量池,
也会OOM。
我就是把书上的内容看了两遍,再看着笔记记录下来 ,希望坚持有进步啊,
题外话:
new的过程:
先去检查这个指令的参数能否在常量池中定位到一个类的符号引用,检查这个符号引用的类是否已经被加载解析和初始化过如果没有被
加载过就先执行相应的类加载过程,如果已经加载过了,就去为这个新对象分配内存(这个大小在类加载完成后便可确定了)之后将分配给他的内存初始化为0,将对象进行必要的设置,
今天更新打卡!!