jvm随笔1-数据区介绍

jvm在执行java程序时有若干数据区:方法区,虚拟机栈,本地方法栈,堆,程序计数器。

程序计数器相当于pc指针,每个线程都有一个,是私有的,指向当前方法执行的位置,在程序运行时使用程序计数器来记录当前执行到的字节码位置。java方法会使用程序计数器记录,但Native方法

而程序运行的时候,需要栈来记录程序运行时的局部变量表等,虚拟机栈用来存储java方法的数据,每个方法对应一个栈帧,方法的执行过程对应一个栈帧的入栈到出栈。本地方法栈则是用于Native方法的相关记录。有的虚拟机会将两种栈合并。
而栈的使用存在两个异常:
StackOverflowError(申请栈深度大于虚拟机允许的,可能爆栈时弹出)
OutOfMemoryError(大部分栈允许动态拓展,若要拓展时申请内存失败时弹出)

每个线程共享的内存区域,用于存放对象实例,也是垃圾收集器管理的主要区域,堆中没有足够的内存来完成实例分配的时候,会抛出OutOfMemoryError。堆也可被进一步细化分来更好的分配和回收内存。且堆的空间分配可以是逻辑连续,不一定要物理连续。

方法区与java堆十分类似,是线程共享的内存区域,存储的是已被虚拟机加载的类信息,常量,静态变量,即时编译器编译的代码等,这个区域可以选择不实现垃圾收集,并且也很少使用垃圾收集,且垃圾回收效果特别差。

常量池并没有被jvm做任何细节上的要求,比较自由,不同的提供商实现的虚拟机可以按照自己的要求来实现,用于存放编译期生成的各种字面量和符号引用。常量池无法再申请到内存时会抛出OutOfMemoryError。

直接内存不是jvm运行时数据区的一部分,但被频繁使用,同样可能导致OutOfMemoryError。

猜你喜欢

转载自blog.csdn.net/maniacxx/article/details/86545796