java虚拟机优化

概念区分:

堆:new 出来的对象都在堆中
栈(线程栈):存放线程中的局部变量和方法,会有一块空间指向堆中的引用
方法区(元空间):常量+静态变量+类信息

=====================================================================================================================================================================================

堆中分类:

堆中又分为Eden(8/10)、survivor1(1/10)、survivor2(1/10)、老年代(2/3)

垃圾回收过程:

1.当创建完对象后会进入Eden区,Eden区满后会进行一次young gc,同时将未能回收的数据放到survivor1中,并把回收次数+1
2,当再次出发young gc时,Eden区还是会把数据放到survivor1中,survivor2和survivor1中的数据交换,并把回收次数+1

3.等到survivor1和survivor2交换过15次以后,将还未回收的数据放到老年代中.

4.当老年代满后,会发生full gc,即(SWT->stop the word)停止所有用户线程,执行垃圾回收.

(为什么会停止所有线程,因为不停掉所有线程的话处理情况太多,不利于垃圾回收)

虚拟机优化的重点,即减少full gc的次数

扫描二维码关注公众号,回复: 12406587 查看本文章

=====================================================================================================================================================================================

java虚拟机优化实例:

1.有一个下单请求,在搞双十一时,假设每个订单对象数据为1kb,300单/秒,那么1秒就是300kb数据

2.因下单是可能还涉及其他对象如库存、优惠券、积分等,所以将此数据量放大20倍,(300kb*20)

3.又因为下单的同时,我们又有查询的操作,所以再讲其放大10倍(300kb*20*10)

4.最终(300kb*20*10)即每秒产生60mb对象,在1秒后即会变成垃圾对象,当young gc进行垃圾回收时,

他会将Eden区中的数据交换给survivor区,此时survivor区的大小一定要大于120mb,因为只要Eden区

进行交换的数据一次性大于survivor区内存的一半,此时survivor区就会直接将这些数据放到老年代中,

而不进行垃圾回收

猜你喜欢

转载自blog.csdn.net/u013008898/article/details/111769170