
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习计算机编程开发技术,而本文我们就通过案例分析来简单了解一下,Java编程入门基础知识分享。
1、程序计数器(PC寄存器)
(1)程序计数器的定义程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此时程序计数器为Undefined。
(2)程序计数器的作用
字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制。
在多线程情况下,程序计数器记录的是当前线程执行的位置,从而当线程切换回来时,就知道上次线程执行到哪了。
(3)程序计数器的特点
是一块较小的内存空间。
线程私有,每条线程都有自己的程序计数器。
生命周期:随着线程的创建而创建,随着线程的结束而销毁。
2、Java虚拟机栈(Java栈)
(1)Java虚拟机栈的定义Java虚拟机栈是描述Java方法运行过程的内存模型。
Java虚拟机栈会为每一个即将运行的Java方法创建一块叫做“栈帧”的区域,用于存放该方法运行过程中的一些信息,如:
局部变量表
操作数栈
动态链接
方法出口信息
......
(2)压栈出栈过程当方法运行过程中需要创建局部变量时,就将局部变量的值存入栈帧中的局部变量表中。
Java虚拟机栈的栈顶的栈帧是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会指向这个地址。只有这个活动的栈帧的本地变量可以被操作数栈使用,当在这个栈帧中调用另一个方法,与之对应的栈帧又会被创建,新创建的栈帧压入栈顶,变为当前的活动栈帧。
方法结束后,当前栈帧被移出,栈帧的返回值变成新的活动栈帧中操作数栈的一个操作数。如果没有返回值,那么新的活动栈帧中操作数栈的操作数没有变化。
由于Java虚拟机栈是与线程对应的,数据不是线程共享的,因此不用关心数据一致性问题,也不会存在同步锁的问题。
3、Java虚拟机栈的特点
局部变量表随着栈帧的创建而创建,它的大小在编译时确定,创建时只需分配事先规定的大小即可。在方法运行过程中,局部变量表的大小不会发生改变。
Java虚拟机栈会出现两种异常:StackOverFlowError和OutOfMemoryError。
StackOverFlowError若Java虚拟机栈的大小不允许动态扩展,那么当线程请求栈的深度超过当前Java虚拟机栈的深度时,抛出StackOverFlowError异常。
HotSpot虚拟机对象探秘
(1)对象头
对象头记录了对象在运行过程中所需要使用的一些数据:
哈希码
GC分代年龄
锁状态标志
线程持有的锁
偏向线程ID
偏向时间戳
对象头可能包含类型指针,通过该指针能确定对象属于哪个类。如果对象是一个数组,那么对象头还会包括数组长度。
(2)实例数据
实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量。
(3)对齐填充
用于确保对象的总长度为8字节的整数倍。HotSpotVM的自动内存管理系统要求对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数(1倍或2倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。对齐填充并不是必然存在,也没有特别的含义,它仅仅起着占位符的作用
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。