JVM体系结构
JVM中主要包括(PC寄存器,栈)(堆,方法区)本地方法区
一个Java线程中,包括PC寄存器(保存当前执行的指令位置)
栈帧(一个方法对应一个栈帧)
方法区是堆的一部分,就是Java的永久区PermGen
JVM方法区是用于存储类结构信息的地方,一个class文件会被解析成JVM能识别的几个部分,这些不同的部分在这个class被加载到JVM时,
会被存储在不同的数据结构中,其中的常量池、域、方法数据、方法体、构造函数,包括类中的专用方法、实例初始化、接口初始化都存储在这个区域。
方法区这个存储区域也属于Java堆中的一部分,也就是Java堆中的永久区。这个区域可以被所有的线程共享,并且它的大小可以通过参数来设置。
本地方法区是为了JVM运行native方法(C/C++等语言写的方法)准备的区域。
内存分配方式
静态内存分配:
在编译时确定需要的内存空间,当程序加载时系统把内存一次性分配给它。
静态内存分配是在Java栈上分配的,当方法结束时对应的栈帧也就撤销,所以分配的内存空间就被回收
动态内存分配:
程序执行时才知道要分配的内存大小,当对象创建的时候,在堆上给对象分配一块空间,空间回收时间不定,由JVM垃圾回收器管理。
垃圾回收
基于分代的堆结构:堆
新创建的对象会分配到Young的Eden上,如果Eden满了就触发MinorGC,将Eden区中存活的对象保存到Survivor的一个区中,
一般,大对象(即需要大量连续存储空间的对象,如大数组)会被直接分配到老年代。
perm区主要保存class对象,垃圾回收也是FullGC触发
JVM中主要包括(PC寄存器,栈)(堆,方法区)本地方法区
一个Java线程中,包括PC寄存器(保存当前执行的指令位置)
栈帧(一个方法对应一个栈帧)
本地变量(保存计算中的临时数据)
方法区是堆的一部分,就是Java的永久区PermGen
JVM方法区是用于存储类结构信息的地方,一个class文件会被解析成JVM能识别的几个部分,这些不同的部分在这个class被加载到JVM时,
会被存储在不同的数据结构中,其中的常量池、域、方法数据、方法体、构造函数,包括类中的专用方法、实例初始化、接口初始化都存储在这个区域。
方法区这个存储区域也属于Java堆中的一部分,也就是Java堆中的永久区。这个区域可以被所有的线程共享,并且它的大小可以通过参数来设置。
本地方法区是为了JVM运行native方法(C/C++等语言写的方法)准备的区域。
内存分配方式
静态内存分配:
在编译时确定需要的内存空间,当程序加载时系统把内存一次性分配给它。
静态内存分配是在Java栈上分配的,当方法结束时对应的栈帧也就撤销,所以分配的内存空间就被回收
动态内存分配:
程序执行时才知道要分配的内存大小,当对象创建的时候,在堆上给对象分配一块空间,空间回收时间不定,由JVM垃圾回收器管理。
垃圾回收
基于分代的堆结构:堆
新创建的对象会分配到Young的Eden上,如果Eden满了就触发MinorGC,将Eden区中存活的对象保存到Survivor的一个区中,
同时将Survivor另一个区存活的对象也保存到Survivor这个区中,Survivor区始终有一个区是空的。
一般,大对象(即需要大量连续存储空间的对象,如大数组)会被直接分配到老年代。
分配规则也不是百分百固定的,这取决于当前使用的是哪种垃圾收集器组合和JVM的相关参数。
Survivor的一个区满了之后,会将对象直接放到Old区,Old区满了会触发FullGC,将回收整个堆空间
perm区主要保存class对象,垃圾回收也是FullGC触发