运行时数据区域
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同点数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和接受二建立和销毁。
主要内容:内存各个区域,区域的作用,服务对象,产生的问题
文章图片
程序计数器每条线程都要有一个独立的程序计数器如果是正在执行的是JAVA方法,这个计算器记录的是正在执行的虚拟机自己买指令地址如果是正在执行的是native方法,这个计数器值为空。JAVA虚拟机栈线程私有的方法执行时创建帧栈,存储局部变量表,操作数栈,动态链接,方法出口栈深度大于模拟机所允许的深度,抛StackOverflowErro异常如果无法申请到足够内存,抛OutOfMemoryError异常JAVA堆内存最大一块,所有线程共享一块内存区域在虚拟机创建时创建所有对象实例已经数组都要在堆上分配。JAVA堆屎垃圾收集器管理的主要区域GC堆对于分代GC来说,堆是分代的如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常方法区与JAVA堆一样是各个线程共享的内存区域存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码通常和永久代在一起这个区域的内存回收目标主要是针对常量池的会后和对类型的卸载无法满足内存分配需求时,将抛出OutOfMemoryError运行时常量池运行时常量池是方法区的一部分class文件中除了有泪的版本,字段,方法,接口描述信息,还有事常量池,用于存放编译期生成的各种字面量和符号引用。当常量池无法在申请到内存时会抛出OutOfMemoryError异常直接内存不是虚拟机运行时数据区一部分,也不是java虚拟机规范中定义的内存区域。这部分内存频繁使用,导致OutOfMemoryError(内存区域综合大于物理内存限制)
HotSpot虚拟机对象探秘
进一步了解这些虚拟机内存中的数据的其他细节,譬如他们是如创建,如何布局以及如何访问的。
对象的创建
1.new指令时,检查这个指令的参数是否在常量池中定位到一个类的符号引用。2.检查这个符号引用代表的类是否已被加载,解析,初始化过。3.为新生对象分配内存,从堆上划分一块内存4.对对象进行必要的设置,例如对象是那个类的实例,如何找到元数据对象的GC分代年龄,这些信息存到对象头中5.执行init方法,将对象按照程序员的意愿进行初始化对象内存布局对象在内存中存储的布局:对象头,实例数据,对其填充对象头存储对象自身的运行时数据,主要存储内容如下:
文章图片
类型指针指向它的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。实例数据对象真正存储的有效信息,各种类型字段内容。对其填充占位符作用
对象的访问定位
使用句柄总结java堆中将会哈ufenchuyikuai内存来作为句柄池。reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息直接指针
文章图片
java堆对象的布局中就必须考虑如何防止访问类型属鸡的相关信息,而reference中存储的直接就是对象地址
文章图片
【JVM_自动内存管理机制】这一部分内容主要学习了内存是如何划分的,哪部分区域,讲解这些区域的作用,服务对象。
推荐阅读
- 把一个xml节点信息递归的存到map中的方法
- Java 多线程 子线程 交替打印 奇偶数
- 给定一个 ArrayList的一个对象,实现在这个集合中添加一个字符串
- J2SE|通过线程按照顺序循环输出ABC n次
- 如何控制线程执行的先后顺序
- weblogic|weblogic——Servlet failed with Exception
- J2SE/JAVA|DOS命令全集