内存3个分区、GC自动垃圾回收机制、Java 的四大引用对象
**
一.什么是堆,栈,方法区
**
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(); //强制回收
弱引用:
虚引用:
- Java的垃圾回收机制,GC,和变量的创建和删除的关系(即变量的作用域,for循环中的某个变量,出了for循环再引用就会报错了,因为该变量已经被从内存中删掉了)
- 对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- 初识java程序的垃圾回收机制及对象在内存中的状态-----自学JAVA(第二节)
- Java垃圾回收机制和Java对象的四种引用以及各自的回收条件
- (转)Java 内存区域分配和垃圾回收(GC)机制
- Java自动内存管理机制学习(二):垃圾回收器与内存分配策略
- JAVA的内存分配策略和自动垃圾回收机制
- 【Java面试整理之JVM】深入理解JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略、JVM内存泄露和溢出
- Java自动内存管理机制学习(二):垃圾回收器与内存分配策略
- 面向对象_引用类型_内存分析_垃圾回收JAVA028-033
- Java自动内存管理机制(三) 对象、引用
- 深入理解java虚拟机阅读笔记二:java自动内存管理机制以及垃圾回收机制
- 对象引用JAVA 各种reference和垃圾回收机制
- JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- JVM内存分区和垃圾回收GC机制
- Java无用内存自动回收机制
- JAVA垃圾回收机制与内存泄露问题
- 成为JavaGC专家Part I — 深入浅出Java垃圾回收机制
- 研究垃圾回收机制,计算对象创建占用的内存
- Java内存回收 垃圾回收机制