GC
GC:是什么,什么情况下会发生GC,如何优化GC,GC针对的对象,GC原理,什么对象会被保留什么对象会被回收
GC:垃圾回收机制(Gbbage Collection) ,对内存中不可达对象进行回收,进而释放内存资源,避免内存溢出的问题。
GC针对的对象 ,如果一个对象没有指向它的引用或者其赋值为null,则次对象适合进行垃圾回收.
GC原理,根据计数器,当一个对象被引用此对象计数+1,当一个对象未被引用计数-1,当计数为0时,符合被回收的规则
如何优化GC,将使用一次使用的对象赋值为null
可达性分析算法来判断对象的存活状态的。
可达和不可达,可达是指一个对象仍然被引用,不可达是一个对象未被引用
不可用可达
如果一个对象没有指向它的引用或者其赋值为null,则次对象适合进行垃圾回收.
什么情况下会发生GC,GC分为两类:Minior GC 和Full GC
当新生带空间不足时会发生MiniorGC,
每次发生MiniorGC时,或判断历来由新生代进入老年的平均大小,如果平均值大于老年的则发生Full GC,如果小于老年代则是MiniorGC
Full GC,当老年代不足时,当方法区内存空间不足,当对中分配较大的对象,当发生minior GC时有概率发生
内存溢出问题
内存泄漏和内存溢出
内存溢出:指程序申请内存时,没有足够的内存供申请者使用,导致数据无法正常存储到内存中。也就是说给你个int类型的存储数据大小的空间,但是却存储一个long类型的数据,这样就会导致内存溢出。
内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出
堆溢出:堆中存放的是一些公共的对象
栈溢出:私有变量和对象
方法区和运行时常量池溢出:
heap
堆溢出:
创建对象过大,创建对象过多,但是不被回收
并发访问量大,访问数据过多,时间过长,导致数据释放不掉,GC无法回收。
解决:先排除代码问题,避免创建大对象,不用的对象及时置null , 避免无效的引用,其次设置内存参数,设置jvm值的方法是通过-Xms(堆的最小值),-Xmx(堆的最大值)
Stack
栈溢出:
递归创建对象,导致栈溢出
分配的栈空间过大调用的线程同时过多,当时栈溢出
Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。
-Xms 堆内存的初始大小,默认为物理内存的1/64
-Xmx 堆内存的最大大小,默认为物理内存的1/4
-Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn
-Xss 设置每个线程可使用的内存大小,即栈的大小