您的位置:首页 > 编程语言 > Java开发

内存3个分区、GC自动垃圾回收机制、Java 的四大引用对象

2020-06-08 04:29 253 查看

**

一.什么是堆,栈,方法区

**
JAVA的JVM的内存可分为3个区:堆(heap)、堆栈(stack)和方法区(method)。
虚拟机:相当于一个小型计算机。
1.1堆
1.类实例对象和数组对象存储区域。
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。

2.2栈
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中。
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

2.3方法区
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
3.运行时常量池都分配在 Java 虚拟机的方法区之中。

二. GC自动垃圾回收机制

2.1什么是自动垃圾回收?
自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。
所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。
在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。

2.2. 垃圾回收算法
转载链接:https://blog.csdn.net/weixin_39067991/article/details/81045201

我们从三个角度来理解gc。
 1jvm怎么确定哪些对象应该进行回收
 2jvm会在什么时候进行垃圾回收的动作
 3jvm到底是怎么清楚垃圾对象的

jvm怎么确定哪些对象应该进行回收
根搜索算法:
根搜索算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点。无用节点被GC。

jvm会在什么时候进行回收
 1会在cpu空闲的时候自动进行回收
 2在堆内存存储满了之后
 3主动调用System.gc()后尝试进行回收
如何回收
标记清除算法:
标记-清除算法采用从根集合进行扫描,对存活的对象标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,如上图所示。标记-清除算法不需要进行对象的移动,并且仅对不存活的对象进行处理,在存活对象比较多的情况下极为高效,但由于标记-清除算法直接回收不存活的对象,因此会造成内存碎片。
比如:1:标记存活对象 0:标记不存活对象。

三 . Java 的四大引用

强引用
强引用就是我们平时使用的对象方式(new),也是使用最多的一种方式,不管内存紧张也罢,不足也罢,gc永不回收强引用的对象。 即使jvm 出现内存溢出错误(OutOfMemoryError),使程序停止,也不会回收对象来提高内存。

Integer data = new Integer(4);
String str = “123”;
Student student = new Student();
//以上三个对象都是强引用对象,指我们平时使用的对象方式

软饮用:
对象具备软引用,只要内存足够,我们不对对象回收,但是当内存不足,gc对软引用对象进行回收。
软引用对内存很敏感,可以用来高速缓存,同时它可以结合队列使用,如果软引用被gc回收,jvm就会把软引用加入到队列中。

String ss = “hello”;
//这时"hello"有一个强引用, 还有一个软引用
ss = null; //强引用没有了,这时只有软引用指向"hello"
//泛型指的是软引用指向的类型
//软引用是内存不足时,对象被回收
SoftReference soft = new SoftReference(ss);
//获取软引用的对象
String content = soft.get();
System.out.println(content);
System.gc(); //强制回收

弱引用:

虚引用:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐