IT外包网管服务,不知道JVM,怎么成为设计者,让他们知道JVM(二)

发布者:上海IT外包来源:http://www.lanmon.net点击数:970

蓝盟IT小贴士,来喽!

使用jconsole或其他调试工具查看可以看到在后台运行的线程很多。 这些正在运行的后台线程不包含基于运行公共静态void main ( string [ ] )的需要而创建的主线程。 所有这些背景线程都是由主线程创建的。 有关HotspotJVM的主要后台系统线程,请参见下表

不知道JVM是怎么成为设计者的,文章知道了JVM,成就了设计者的道路
单线程
每个线程的一次运行包括以下组件
程序计数器( PC )
除非当前命令或操作码是本机命令或操作码,否则当前命令或操作码的地址必须通过PC进行寻址。 如果当前方法为本机,则PC为undefined。 所有的CPU都有一台PC,通常PC在各命令执行后被追加,指的是将要执行的下一个命令的地址。 JVM使用PC跟踪正在运行的命令的位置。 事实上,PC用于指向methodarea的内存地址。
原生码头
不是所有JVM都支持本机方法,但是支持此功能的JVM通常会为每个线程创建本机方法栈。 如果在JVM的JNI(JavaNative Invocation )中采用c链路模型的实现,本机堆栈也将成为c实现的堆栈。 在此实例中,回放栈中的参数的顺序、返回值与普通的c程序相同。 本机方法为JVM生成回调(取决于JVM的实现)并运行Java方法。 对Java的本机调用发生在堆栈上(通常在Java堆栈上),同时线程也离开本机堆栈,通常在Java堆栈上创建新的frame。
码头
每个线程都有自己的堆栈,用于存储在线程上执行的每个方法的frame。 堆栈是后续的数据结构,将当前正在运行的方法放在堆栈的顶部。 每次运行该方法时,都会创建一个新的frame并将其堆栈在堆栈顶部。 如果方法恢复正常,或者在方法运行期间发生未捕获的异常,frame将被堆栈。 除push/pop frame对象外,堆栈不会直接操作。 因此,frame对象可以分配给堆,并且内存也不必是连续的地址空间(请注意区分frame指针和frame对象)。
堆栈限制
栈可以是动态的或合适的大小。 如果线程需要更大的堆栈,则会抛出StackOverflowError异常。如果线程需要创建新的frame,并且没有足够的内存空间进行分配,则会抛出OutOfMemoryError异常。
Frame
每次执行一个方法时,都会创建一个新的frame并将其堆栈在堆栈顶部。 如果方法恢复成功,或者在方法运行期间发生未捕获的异常,frame将被堆栈。
局部变量数组
局部变量数组包含执行方法时使用的所有变量。 包含对this的引用、所有方法参数和其他本地定义的变量。 对于类方法(如静态方法),存储方法参数的索引从0开始;对于实例方法,保留索引为0的时隙以存储this指针。
操作数堆栈
操作数堆栈用于执行字节码指令的过程。 这类似于本机CPU使用的通用寄存器。 大多数字节码都将时间花在与操作数堆栈的交互上,进入堆栈、离开堆栈、复制、更换或执行它们的生产/消耗值操作。 在字节码中,在局部变量数组和操作数堆栈之间移动值的指令非常频繁。
动态链接
每个frame都包含对运行时常量池的引用。 此引用指向要执行的方法所属类的常量池。 此参照也用于辅助动态链接。
编译Java类时,存储在类的常量池中的所有变量和对方法的引用都将作为符号引用。 符号引用只是逻辑引用,最终不是对物理内存地址的引用。 JVM实现允许您选择分析符号引用的时间。 该定时在验证类文件后被加载之后被称为eager或者静态分析。当第一次使用符号引用时,该差异也可以被称为lazy或者延迟分析。 但是,JVM必须确保在发生分析错误时抛出异常,并且在首次使用每个引用之前发生分析。 绑定是将由符号引用标识的字段、方法或类直接替换为引用的过程。 此过程仅发生一次,因为必须完全替换符号引用。 如果符号引用具有关联的类,并且该类尚未解析,则会立即加载该类。 每个直接引用都存储为一个偏移量,用于关联变量或方法在运行时的位置。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部