关注
java程序的运行流程
众所周知所有的Java程序代码必须保存在.java的文件之中,这些称为源代码。而这些源代码并不能够直接执行,必须使用javac.exe命令将其编译为.class文件,而后利用java.exe命令在JVM进程之中解释此程序。
实际上当JVM将所需要的*.class文件加载到JVM进程之中,那么这个过程就需要有一个类加载器(ClassLoader),有了类加载器的好处在于:可以随意指定程序 .class文件的所在路径。
类加载器概念
JVM:Java虚拟机,所有的程序都要求运行在JVM上,是因为考虑到了可移植性问题,可是如果要想真正去执行程序,你绝对不可能离开操作系统的支持。
在Java里面可以使用native实现本地C函数的调用。但是这些都属于程序运行的辅助手段,而真正的程序运行都在“运行时数据区”之中。
运行时数据区
运行时数据区由以下几个部分组成:
堆内存:保存所有引用数据类型的真实信息
栈内存:基本类型,运算,指向堆内存的指针
方法区:所有定义方法信息,属于共享区
程序计数器:是一个很小的内存空间,用于执行下个执行的代码
本地方法栈:每一次执行递归的方法处理都会将上一个方法入栈
栈
栈内存是线程私有的,栈的生命周期和线程相同;栈描述的是java方法执行的内存模型,执行一个方法的时候会产生一个栈帧,随后将其保存到栈顶,方法执行完毕自动出栈。顶部的栈帧表示的是当前的方法;注意的是如果栈的深度过大。如递归过深虚拟机会抛出StackOverError。如果虚拟机允许栈动态扩展内存不足时抛出OutOfMemoryError.
栈帧 局部变量表:方法的局部变量或形参 操作数栈:表达式的计算
方法所属类的运行时常量池常量池的引用:引用其他类常量或者字 符 串常量池的字符串
方法返回地址:方法执行完后需要返回调用该方法的位置,所以要在栈帧中保存方法的返回地址
关于常量池的简单介绍
在整个Java之中存在有对象池的概念,对象池是对整个常量池的一个规则破坏,因为在JVM启动的时候所有的常量都已经分配好内存空间了,但是String中的intern()方法却可以打破这种限制,动态的进行常量池的内容设置
对象的访问模式
Obiect obj=new Object();为例 Obiect obj 保存在栈内存中,有对应的堆内存引用
new Object() 一个真的对象保存在堆内存中
引用操作
新定义的的对象名称保存在本地变量表中,而后在这块区域确定与之对应的栈空间通过栈地址找到堆内存,利用堆内存对象调用本地方法。
实际上所有的引用数据类型的访问有两种模式:一是通过句柄访问,一是通过对象指针直接访问。但是在Java之中它直接利用的是对象保存模式,也就是说堆内存里面不再需要保存句柄,而直接保存具体的对象。就相当于省略了句柄到对象间的查找。而后这个对象可以直接进行Java方法区的调用。
通过直接指针访问–HotSpot虚拟机(jvm)
引用数据类型在HotSpot中都是直接进行的引用处理,没有句柄池的概念。
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 小厂实习有必要去吗 #
30969次浏览 213人参与
# 我的工作日记 #
52316次浏览 748人参与
# 国企和大厂硬件兄弟怎么选? #
112650次浏览 1637人参与
# 影石Insta360求职进展汇总 #
107075次浏览 960人参与
# 文科生还参加今年的春招吗 #
2774次浏览 24人参与
# 选择和努力,哪个更重要? #
40167次浏览 459人参与
# 如果再来一次,你还会学硬件吗 #
102204次浏览 1228人参与
# 中核求职进展汇总 #
13036次浏览 123人参与
# 我的国央企投递进展 #
35728次浏览 242人参与
# 如果公司降薪,你会跳槽吗? #
43849次浏览 341人参与
# 一人推荐一个值得去的通信/硬件公司 #
160812次浏览 1734人参与
# 长光卫星求职进展汇总 #
27334次浏览 180人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
68164次浏览 492人参与
# 机械人选offer,最看重什么? #
68409次浏览 431人参与
# 大疆的机械笔试比去年难吗 #
63960次浏览 576人参与
# 大疆今年的机械笔试难吗? #
35147次浏览 407人参与
# 你的秋招简历被谁挂了? #
216022次浏览 2402人参与
# 考公VS就业,你怎么选? #
51518次浏览 369人参与
# 秋招盘点:机械人值得去的企业 #
60871次浏览 630人参与
# 24届市场营销薪资爆料 #
9326次浏览 62人参与