博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA高级篇(二、JVM内存模型、内存管理之第一篇)
阅读量:4593 次
发布时间:2019-06-09

本文共 1172 字,大约阅读时间需要 3 分钟。

 

JVM内存结构如

 

 

  • Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
  • 方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  • 程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
  • JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
  • 本地方法栈(Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

对象分配规则

  • 对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。
  • 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
  • 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
  • 动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
  • 空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。

 

转载于:https://www.cnblogs.com/XiOrang/p/9355583.html

你可能感兴趣的文章
Django 应用开发(3)
查看>>
自己写的java实现的多路搜索树 B-Tree
查看>>
Snow Footprints CodeForces - 298A
查看>>
Choose and divide UVA - 10375
查看>>
Delete Them
查看>>
JSON跨域原理实现
查看>>
wiringPi 库下用C控制GPIO
查看>>
Excel-单条件和多条件匹配搜索
查看>>
Android bluetooth low energy (ble) writeCharacteristic delay callback
查看>>
Delphi7使用一段时间后抽风提示注册
查看>>
intent介绍
查看>>
css元素垂直居中
查看>>
启用WCF测试客户端(WCF Test Client)的相关技巧
查看>>
用 XML 文件持久化和恢复图片信息
查看>>
完美洗牌算法
查看>>
Redis-数据操作
查看>>
noip 2012 Day2 T2 借教室
查看>>
Css:背景色透明,内容不透明之终极方法!兼容所有浏览器
查看>>
Atitit 常用比较复杂的图像滤镜 attilax大总结
查看>>
给大忙人看的Java核心技术笔记(1、基本的编程结构)
查看>>