概念区分:
堆: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的次数
=====================================================================================================================================================================================
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区就会直接将这些数据放到老年代中,
而不进行垃圾回收