java对象从创建开始,都经历过什么

        有一个叫hotspot的王国,由于整个国家的资源都是有限的,所以他们奉行一条铁律,无用的事物,要把它消灭掉,尽可能最大限度的利用资源。

        这个国家的城市划分划分如下:堆,方法区,虚拟机栈,本地方法栈,程序计数器。每个城市,都有它独特的地方,生活在每座城市里面的人,各司其职,保证国家的正常运行。

        我是一个java对象,我出生在这个王国的繁华城市--堆之中的eden区,堆的区域被划分为新生代区域和老年代区域,他们的面积之比是1:2。而新生代的区域又被分成了eden区,survive0区和survive1区,他们的面积之比是8:1:1。(当然,这些区域的面积通过一些参数,是可以更改的)

survive0区,survive1,还有别称,叫from区,to区域,会有两种情况,survive0是from区,survive1是to区或者survive0是to区域,survive1是from区域。这是为了解决垃圾回收导致的内存碎片化的问题。

        假设,只有一个survive区域,那么每一次minorGC之后,survive区域的一部分对象被回收之后,剩下的一部分对象它们之间是存在空隙的,这叫做内存碎片。所以,开辟了两个survive空间,每一次GC之后,将其中一个survive(from)区域的存活对象和eden区域的存活对象,都复制到另一个survive(to)区,并将原来的survive即from区域清空,这时候,from区也成了to区域,from和to的角色互换了,空闲的survive区供下次GC时使用,这样就不会产生内存碎片化的问题了。浪费了10%的内存空间,以空间换取效率

其中,程序计数器,虚拟机栈,本地方法栈是线程私有的,每个线程,都有自己专有的。

而方法区,堆是线程共享的,然而我们知道,线程共享就会出现临界资源同步使用的问题,谁先用这块内存,谁后用这块内存,这是一个问题。当一个线程A正在分配内存,创建对象,指针指向的内存地址还没有修改,这时候,另一个线程B又拿到了原来的指针,进行操作,这样A线程创建的对象就会被B线程覆盖掉。

解决这个问题,有两种方案,一种是采用CAS配上失败重试的方案保证更新操作的原子性,

另一种则是,给每个线程开辟一块单独的buffer,这样就不会有谁抢东西了,这个buffer称为TLAB(Thread Local Allocation Buffer)

        我一生的故事就是从eden(伊甸园)开始的。

        在eden的时候,有很多和我长的很像的小家伙,我们年级相仿,我们不知道我们为何在此,也不知道将往何处去。但我们知道,我们必须要有用,不然就会抛弃。

        我和那些小家伙一起玩了挺长的时间,有一天eden区中的人实在是太多了,受区域面积限制,实在塞不下那么多人,minorGC长官让我和一些小家伙去了to区域。还有一些小家伙从这个世界上消失了,我生来便知道,谁都会面临这一天。

        在to区域生活的时候,又认识了一些新的伙伴,据它们说,它们是从from区域来的,然而,稍微比我们年长的家伙,颇为自得的带着鄙夷的目光看着我们说:“这里以前也是from区域,也即将再次成为from区”。我们不信,但是时间却证明了这件事情。每次minorGC来的时候,我们都被迫搬到新的to区域,一次次,一次次,身边的小伙伴越来越少,不论是年龄比我小的,还是年龄比我大的,它们都慢慢的从我身边离去。我知道,我生来便知道,谁都会面临这一天。

        我辛勤的奉献着,在from区域和to区域不知道度过了多少个年份,听过太多人的故事,见过

太多人的来来去去的身影。终于有一天,minorGC长官,说我的年龄到了,可以去老年代区域了,于是,我就来到了老年代,老年代这里有很多和我一样的家伙,总是不死。我们等待着majorGC的回收,结束我们的一生,多么平凡普通的一生。

        其实这里还有很多值得探讨的问题,比如,虚拟机栈里面是什么东西,当然是栈帧了,那么栈帧里面又有什么,当然主要的就是局部变量表,操作数栈,动态链接,方法出口。

        什么是CAS?又如何保证线程安全的?

        既然总说对象,对象的,那咱这个对象到底长啥样?她的结构是啥样子?记载了什么信息,这些信息都有什么用?这些都可以去学习学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值