这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
前言
之前讲了java的基础,在基础中有聊到关于虚拟机的内容,这次是为了补充上一次jvm,并且进入深层探讨。
jvm初识
jvm全程java虚拟机,Java Virtual Machine,java的全平台就靠虚拟机来实现。虚拟机最大的特点是内存管理,也就是内存交由java虚拟机管理,用户也就是程序不用担心内存分配的问题。
jvm中的几个模块
先看图片了解大概的jvm虚拟机布局分配,图来自《深入java虚拟机》
本章节主要讲述下运行时数据区的内容,个人理解
方法区
方法区,属于所有线程共享的区域,也是会被GC波及到一块区域,也可以称为小堆,他存储类型信息、常量、静态变量、即时编译器后的代码缓存数据。 String a = “test”,test存放地址就是方法区。
堆
堆,属于所有线程的共享区域,这个区域属于GC重点关注区域,在堆中虚拟机采用了分代收集策略,也就是耳熟能详的新生代和老年代这两个区域。在新生代中又被分为eden 空间和 from 空间和 to空间。
分代这里在书中提及是因为两个假说:
- 绝大多数对象都是朝生夕灭的,也就是对象一般并不会存活很久
- 熬过多次GC的对象就更难消亡,也就是清理了多次这个对象,越往后其实在清理它它依旧是还能存活下来
这两个假说其实就说明了一般对象的存活有两个极端,但大多数对象一般并不会存活很久,但是存活下来的对象,如果经历多次GC还没清掉,说明这个对象被强引用着。
总结
经过分代假说的理论,在堆中实现的分代收集就是基于此理论思想的实现。在回收的次数上把他的次数定义为一个对象的年龄,熬过越多GC他的年龄越大,然后根据他们的年龄来进行分类,重点去关注少量存活的对象,而不是全局兼顾,在全局兼顾的情况下会导致性能的瓶颈。