标签:基本数据 计算 返回 string 存储 规范 计算过程 字节 原理
一.java程序的具体执行过程:
1.java源文件会被java编译器编译成字节码文件
2.然后由jvm中的类加载器加载各个类的字节码文件
3.加载完后,由jvm的执行引擎执行
备注:在执行的过程中jvm一段空间来存储数据:运行时数据区,也称jvm内存
二.根据jvm规范,jvm把内存划分为了如下几个区域:
1.程序计数器:也称pc寄存器,用来指示执行哪条命令的,
每个线程都有一个,为了不影响程序的正常执行顺序。
2.java栈:存放的是一个个的栈帧,每个栈帧都对应一个方法,栈帧中包括如下:
1)局部变量表:存放基础数据类型的值,引用类型对象的引用
2)操作数栈:程序中的所有计算过程都是在借助于操作数栈来完成的。
3)运行时常量池的引用:指向运行时类中的常量
4)方法返回地址:返回调用方法的地址
注:栈的垃圾回收是由系统自动分配的,每个栈对应一个线程,也就是说每个线程都有自己的栈
3.本地方法栈
执行原理与java栈相似,只是它为执行本地方法服务.
4.堆区
存放对象的本身以及数组,堆被所有线程共享,在jvm中只有一个堆
5.方法区,常称为永久代,因为执行GC的情况很少,其上的gc主要针对常量池的回收和已加载类的卸载.
1)运行时常量池:在类和接口被加载到JVM后,对应的运行时常量池就被创建出来,
当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中
2)静态域:存放在对象中用static定义的静态成员
注:
1)方法区中存取了每个类的信息,静态变量,常量以及编译器编译后的代码
2)String常量也是存放在常量池中的.class文件中的一些数据.
3)常量池是指在编译器被确定,并保存在已编译的
4)方法区是全局共享的,
注释:java的内存分配细分:
1)寄存器:我们在程序中无法控制
2)栈:存放基本数据类型和对象的引用
3)堆:存放用new产生的数据
4)静态域:存放在对象中用static定义的静态成员
5)常量池:存放常量
6)非RAM(:随机存取存储器,也称为主存,
与cpu直接交互数据大的内部存储器)存储:硬盘等永久存储空间
注:从java5.0开始,java虚拟机在启动时会实例化9个对象池.这九个对象池分别存储8种基本数据类型的包装类和String对象
当在程序中直接用双引号给字符串对象时,jvm就到String的对象池中检查是否有一个值相同的对象,如果有返回现有对象的引用
如果没有,则在对象池中创建,如果是new一个对象,则是直接在对象池中创建,没有上述操作
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
str1 == str2 true;
str2 == str3 false;
标签:基本数据 计算 返回 string 存储 规范 计算过程 字节 原理
原文地址:https://www.cnblogs.com/nyhhd/p/12545388.html