jvm-对象的创建和分配和垃圾回收

CAS (compare AND swap ) 机制:比较和交换机制,解决分配对象内存的并发问题分配内存的方式:指针碰撞和空闲列表

 以前的jvm是采用CAS解决线程并发的问题,但存在不断循环CAS浪费cpu,现在多采用给每个线程分配不同的内存地址,在虚拟机中,默认分配内存会先走第二种,开发者关闭了才走CAS

一个java的对象包含这些东西:

GC回收

判断对象存活的方法中,一般常用的是引用计数算法,就是一个对象有引用时+1,这个比较简单,但是当两个对象相互指向时就麻烦了,因为按理说这两个是没用的对象,应该是垃圾,应该被回收,但是造成了了一个死锁,所以无法被回收,目前的虚拟机中采用的是可达性分析算法

可达性算法的原理:GC中有个数组存储着栈,静态变量,常量池中等数据为根节点,去遍历,假如没有遍历到兑中这个对象就会被回收中一个对象没有任何东西引用他,则视为一个垃圾,应该被回收,例如下面的死锁,他们只是在堆中互相指引着,但是在GC roots中没有东西指引他们两个,所以GC视为垃圾

 Java的引用:

 

 强引用:只有有强引gc是不会回收的

软饮用:只有当应用内存不够的时候,会回收

弱饮用:只要触发GC就会被回收

垃圾回收的对象分配原则:

1.age的晋级还有一个是动态年纪判断

比如:从to到老年带

是从TO 区age最小的开始加,大于TO设置内存的一半时,将从加到结束的那个年纪开始到最大年纪的直接移动到老年代

2.还有就是age年龄的大小问题,这个阀值是虚拟机设置的,大部分是15,大于这个阀值的时候也晋级

为什么新生代分为3个区?这是因为新生代回收是采用复制算法的,三个区的大小Eden:from:to=8:1:1   如下图

 

 垃圾回收的算法:

根可达算法查找不可回收的对象

复制算法:将不回收的对象,复制到预留空间,然后将垃圾回收

例如:新生代的Eden区,在Eden区中有一个预留空间s0和s1,当Eden区满的时候会出发GC

老年代采用的是清除算法,主要原因是老年代基本都是存活的,没必要复制

垃圾回收:

 Young GC只是回收新生带,而full GC是回收 老年代,还有方法区

问题1:扩容新生代会增加效率吗?

猜你喜欢

转载自blog.csdn.net/xueyoubangbang/article/details/121517474