2 认识java虚拟机的基本结构

来源:互联网 发布:mac tomcat端口被占用 编辑:程序博客网 时间:2024/05/17 19:58

2 认识java虚拟机的基本结构

image

类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间。除了类信息外,方法区还会存放运行时常量池信息,包括字符串字面量和数值常量。

java堆在虚拟机启动时建立,它是java程序中最主要的内存工作区域。几乎所有的java对象实例都存放在java堆中。堆空间是所有线程共享的。

每一个java虚拟机线程都有一个私有的java栈。一个线程的java栈在线程被创建的时候被创建。java栈中保存着帧信息。

PC寄存器也是每个线程的私有的空间,java虚拟机会为每一个java线程创建PC寄存器。在任意时刻,一个java线程中总是在执行一个方法,这个被正在执行的方法称为当前方法。如果当前方法不是本地方法,PC寄存器就会指向当前正在被执行的指令。

设置java虚拟机参数

java [-opitions] class [args]

示例

java -Xmx32m geym.zbase.ch2.SimpleArgs a // 设置系统最大可用堆空间为32m

函数如何调用

在java栈中主要保存的内容就为栈帧。每一次函数调用,都会有一个对应的栈帧被压入java栈。每一个函数调用结束,都会有一个栈帧被弹出java栈。

在一个栈帧中,至少要包含局部变量表,操作数栈和帧数据区几个部分。

局部变量表

局部变量表是栈帧的重要组成部分。它用于保存函数的参数 以及局部变量。局部变量表中的变量只在当前函数调用中有效,当函数调用结束后,随着java栈帧被弹出,局部变量表也会随之销毁。

栈帧中局部变量表的槽位是可以重用的。

实例方法的第一个局部变量都是this引用。

局部变量表中的变量也是重要的垃圾回收根节点,只要局部变量表中直接或者间接引用的对象都不会被回收。

帧数据区

大部分java字节码需要进行常量池访问,在帧数据区中保存着访问常量池的指针。

栈上分配

栈上分配是java虚拟机提供的一项优化技术,基本思想是对于那些线程私有的对象,可以把他们打散分配到栈上。例如,将不可逃逸对象的属性视为独立的局部变量分配到栈上。

分配到栈上的好处是可以在函数调用结束后自行销毁。

方法区

和java堆一样,方法区是一块所有线程共享的内存区域。它用于保存系统的类信息。方法区的大小决定了系统可以保存多少个类。

在jdk1.6和1.7中,方法区可以理解为永久区(Perm)。

在jdk1.8中,永久区已经被彻底移除,取而代之的是元数据区。与永久区的区别是,在默认情况下,虚拟机会耗尽所有可用的系统内存。

原创粉丝点击