JVM概述
程序计数器
占用内存较小,是当前线程所执行的字节码(JVM指令)行号指示器,JVM通过改变计数器的值来选取下一条要执行的指令。
多线程之间的程序计数器相互独立,互不影响,为了保证每个线程恢复之后都能回到之前中断的位置,进而继续执行。
Java堆
一般所说的“堆”就是指Java堆,是用来存放java对象的,每个Java对象都是存放在堆中的。
面向对象编程语言和面向过程编程语言的区别?
面向过程关注的是每一步具体的细节,将程序细化到具体的步骤
面向对象关注的是程序能够抽象出多少个数据模型,不需要关注的具体步骤
Java堆被所有线程共享,Java内存结构中的大头,占用了大部分空间,是GC(垃圾收集器)的主要管理区域。
Java堆又分为年轻代,老年代,永久代。三者都是存放java对象的
年轻代
又分为Eden区和Survivor区
Eden:伊甸园
Survivor:幸存者(Survivor From、Survivor To)
Eden:对象刚创建的时候,存放在Eden区
Survivor:GC回收的时候,将Eden不需要回收(存活)的对象存入Survivor From区,在下一次回收的时候,将From区中不需要回收的对象存入To区,然后清理From区,在下下一次回收的时候,接着将To区中不需要回收的对象存入From区,再清理To区,依次循环。。。
每次回收之后,存活下来的对象年龄都会 +1,年龄增加到一定程度,移动到老年代中。
老年代
存放生命周期较长的对象
永久代
JDK1.7之前将类的信息存放在永久代中,JDK1.8之后去掉了永久代改为元空间
元空间和永久代是方法区的具体实现,方法区只是一种规范。
1.7 之前字符串常量池存放于永久代中,1.8 去掉了永久代,1.8 之后的字符串常量池放在堆中,为什么要这样处理?
因为永久代空间有限,创建字符串对象,需要调用 inter 方法。
元空间使用的是本地内存,而永久代使用的是JVM内存
本地内存有多大,元空间就有多大,不再受限于 JVM 内存的大小,相当于开辟出更多的区域可以使用,效率更高。
虚拟机栈
通常所说的栈就是虚拟机栈,Java方法的执行是在虚拟机栈中完成的,栈中存放的是栈帧,每个栈帧对应一个被调用的方法,方法的执行其实就是出栈和入栈的过程。
栈帧包括:
1、局部变量表(Java 方法中用到的变量)
2、操作数栈(数据入栈出栈,包含运算符栈)
3、动态链接(方法的返回地址,方法的出口)
每一个方法的执行,JVM 都会创建一个栈帧,并且将栈帧压入 Java 栈中,方法执行完毕,该栈帧出栈。
IDE 集成开发平台
NetBean、Eclipse(MyEclipse)、IDEA(主流的开发软件)
IDEA 插件 提升开发效率