Java虚拟机(二) 方法区 与 堆

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

前言

之前讲了java的基础,在基础中有聊到关于虚拟机的内容,这次是为了补充上一次jvm,并且进入深层探讨。

jvm初识

jvm全程java虚拟机,Java Virtual Machine,java的全平台就靠虚拟机来实现。虚拟机最大的特点是内存管理,也就是内存交由java虚拟机管理,用户也就是程序不用担心内存分配的问题。

jvm中的几个模块

先看图片了解大概的jvm虚拟机布局分配,图来自《深入java虚拟机》

image.png

本章节主要讲述下运行时数据区的内容,个人理解

方法区

方法区,属于所有线程共享的区域,也是会被GC波及到一块区域,也可以称为小堆,他存储类型信息、常量、静态变量、即时编译器后的代码缓存数据。 String a = “test”,test存放地址就是方法区。

堆,属于所有线程的共享区域,这个区域属于GC重点关注区域,在堆中虚拟机采用了分代收集策略,也就是耳熟能详的新生代和老年代这两个区域。在新生代中又被分为eden 空间和 from 空间和 to空间。

分代这里在书中提及是因为两个假说:

  1. 绝大多数对象都是朝生夕灭的,也就是对象一般并不会存活很久
  2. 熬过多次GC的对象就更难消亡,也就是清理了多次这个对象,越往后其实在清理它它依旧是还能存活下来

这两个假说其实就说明了一般对象的存活有两个极端,但大多数对象一般并不会存活很久,但是存活下来的对象,如果经历多次GC还没清掉,说明这个对象被强引用着。

总结

经过分代假说的理论,在堆中实现的分代收集就是基于此理论思想的实现。在回收的次数上把他的次数定义为一个对象的年龄,熬过越多GC他的年龄越大,然后根据他们的年龄来进行分类,重点去关注少量存活的对象,而不是全局兼顾,在全局兼顾的情况下会导致性能的瓶颈。

Supongo que te gusta

Origin juejin.im/post/7031173086678351908
Recomendado
Clasificación