Java的内存划分全解析

Java的内存划分全解析

Java把内存划分成两种:一种是栈内存,一种是堆内存。以下是整理的Java的内存划分全解析,希望对大家有所帮助。

栈内存

存放对象:函数中基本类型的变量和对象的引用变量、静态类方法

特点:栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:

inta=3;

intb=3;

编译器先处理inta=3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。

接着处理intb=3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。

堆内存

存放对象:用来存放由new创建的对象和数组。

特点:在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。

引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

Q:static关键字,是一个修饰符,用于修饰成员(成员变量和成员函数),有什么特点

A:1、想要实现对象中的共性数据的对象共享。可以将这个数据进行静态修饰。

2、被静态修饰的成员,可以直接被类名所调用。也就是说,静态的成员多了一种调用方式。类名.静态方式。

3、静态随着类的加载而加载。而且优先于对象存在。

Java内存回收

Java的内存分配和回收也主要在Java的堆上进行的,Java的堆中存储了大量的`对象实例,所以Java的堆也叫GC堆。

下面主要说一下对于java堆的内存回收 。

什么样的内存可以回收

判断法1:引用计数

方法:每有一个引用指向这个对象,那么这个对象的引用计数+1,反之,每有一个引用改变了指向,那么他原来指向的对象引用计数-1,当引用计数为0的时候,这个对象也就不可能被使用了那么就可以被回收了

问题:可能会出现环状的引用,导致不可能被使用的对象永远不可能被回收

示例:

Class A {

A a;

Public static void main(String[] args){

A gc1 = new A();

A gc2 = new A();

Gc1.a = gc2;

Gc2.a = gc1;

Gc1= null;

Gc2 = null;

}

Gc1和gc2都被设置成null了,他们都应该被清理,但是因为gc1的a对象指向gc2,gc2的a对象指向gc1,导致他们的引用计数永远为1,但是他们都永远不可能被使用了,所以这种方法存在漏洞

判断2:可达性分析算法

方法:从一个叫做GC ROOTS的节点出发,所有能够到达的引用对象标记起来,直到走到完全没有引用的地方为止,这样从这个节点连起来的所有的点(引用链),构成的路线就是不可回收的,那么所有没有被到达过的对象均可以被回收

什么可以做GC ROOTS:虚拟机栈(栈帧中的本地变量表)中的引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI引用的对象

这些对象的特点:不可变并且随时可能被用到,生命周期长

补充:可达性分析的算法,那么没有在引用链上的对象都一定会被清理吗?不一定。当运行可达性分析的算法之后,会对所有没有在引用链上的对象进行一次标记和筛选,筛选的条件为:该对象覆盖了finallize()方法(这个方法是GC的时候如果这个对象要被回收则执行的方法,但是在Thinking in java中不推荐用来处理收尾工作),并且这个方法没有被执行过,那么就会把这个对象放到一个低优先级队列中执行,也就是这个对象的最后抢救的机会,如果这个时候这个对象把自己和在引用链上的引用连了起来,那么他在执行完finallize方法之后,再次判断时就不会被清理,否则会在第二次可达性判断的时候直接清理(因为finallize已经执行过一次了),如果没有覆盖这个方法,那么对不起,再见

回收算法介绍:

回收算法1:标记清理(Mark——sweep)算法

标记所有需要回收对象,然后将他们清理回收

问题:会产生内存碎片

优点:不需要暂停所有线程(Stop the world)

回收算法2:复制

标记后,将所有不需要回收的对象全部复制到一个空的内存中,然后清理刚刚使用的内存块

问题:浪费资源,会有一些内存堆无法被使用

解决:用在新生代,新生代会有80%以上的对象经过一次GC就会死亡,因此采用Eden + Survivor * 2的办法,Eden = 8 * Survivor大小(HotSpot默认),那么每次使用一个Eden + 一个Survivor,然后进行复制清理的时候,清理Eden + Survivor中,然后将可用的对象复制到空闲的Survivor中,然后全部清空前面的使用区,然后使用Eden 和复制到的Survivor

又一个问题:如果Survivor不够怎么办?向老年代借空间,叫做分配担保,不够存放的对象会通过分配担保进入老年代

问题:需要 stop the world

回收算法3:标记整理(Mark——compact)

标记后,将可用内存向一侧摆放,然后清理掉可用内存边缘外部的所有内存区域

优点:没有内存碎片的问题

问题:需要stop the world

回收算法4:分代收集

将堆分代(老年代、新生代),老年代采用标记整理、标记清理等方法,新生代采用复制方法。

为什么:因为老年代大部分对象是可用的,因此如果采用复制算法,虽然没有内存碎片,但是空间浪费大,而且大部分对象没有变化,而在新生代使用复制算法,可以牺牲很小的内存空间就获得较好的效率

HotSpot中内存回收算法

枚举根节点(GC ROOTs)

Java虚拟机采用准确式GC,有一个OOPmap来标记哪个位置有个对象,这样在查找引用链的时候可以较快的找齐所有的引用链

Safepoint

在OOPmap的协助下,这个可以快速且准确的完成枚举,但是问题就是导致这个oopmap变化的指令非常多,如果为每一条指令生成oopmap,那么会需要大量额外空间,因此采用在特定点的地方生成,这些点同时也是safepoint的点,那么当需要枚举根节点的时候,就让线程运行到这个地方再停止。

一种方法:先停止所有线程,然后再让没有到安全点的线程自己跑到安全点再停下来,基本不适用,抢先试中断

另一种方法:主动式中断,设置一个标记,在执行的时候去轮询,而需要中断的时候,直接将这个位置的内存设置不可达,那么线程就会进入一个自陷异常,就自己会中断

Java的内存划分全解析

转载请注明出处我优求知网 » Java的内存划分全解析

学习

仙逆经典语录

阅读(33)

本文为您介绍仙逆经典语录,内容包括仙逆经典语录短句,仙逆经典语录壁纸。《仙逆》是连载在起点中文网的一本已完结的玄幻修真小说,作者是耳根。下面是为大家整理收集的关于仙逆的经典语录,欢迎大家的阅读。

学习

天高地厚的意思

阅读(34)

本文为您介绍天高地厚的意思,内容包括天高地厚的意思解释,天高地厚的意思是什么。天高地厚原形容天地的广大,后形容恩德极深厚。也比喻事情的艰巨、严重,关系的重大。出自《诗经·小雅·正月》。下面是收集整理的天高地厚的意思,希望对你有

学习

乱搭乱建整治工作简报(精选)

阅读(27)

本文为您介绍乱搭乱建整治工作简报(精选),内容包括乱搭乱建的整治方案,乱搭乱建专项整治方案。在社会发展不断提速的今天,简报起到的作用越来越大,简报又称“动态”“简讯”“要情”“摘报”“工作通讯”“情况反映”“情况交流”“内部参考

学习

广东省2A大学排名

阅读(56)

本文为您介绍广东省2A大学排名,内容包括广东省2a以上大学排名,广东省2a大学分数线。广东省较好的2A大学排名,广东2a大学排名出炉相信报考志愿是令很多考生头疼的事情,俗话说:“考的好不如报的好。”因为志愿报考不理想而导致落榜的.人多的

学习

大学生笔记本电脑哪款好

阅读(36)

本文为您介绍大学生笔记本电脑哪款好,内容包括大学生选择笔记本电脑哪款比较好,大学生用哪款笔记本电脑好。还有一个月就要开学了,小伙伴准备好自己的电脑了吗?下面是推荐的一些大学生电脑品牌,欢迎大家阅读参考!

学习

槐乡的孩子课文原文

阅读(52)

本文为您介绍槐乡的孩子课文原文,内容包括槐乡的孩子课文原文及译文,槐乡的孩子课文原文。槐乡的孩子这是一篇略读课文。课文主要描写了生活在槐乡的孩子们采摘槐米的经过,赞美了槐乡的孩子们纯朴勤俭、吃苦耐劳的品质;虽然采摘槐米是辛苦

学习

2020年广东高考本科二批二本大学投档分数线排名

阅读(44)

本文为您介绍2020年广东高考本科二批二本大学投档分数线排名,内容包括2020年广东各院校二本理科分数线,2020年广东一本和二本最低分数线。高考是众多学子要经历的一道大关,高考结束后的分数线能去到哪些学校呢?下面是整理的2020年广东高考

学习

电脑内存条的作用

阅读(35)

本文为您介绍电脑内存条的作用,内容包括电脑内存条的作用和用途,电脑内存条的作用影响运行吗。内存条是CPU可通过总线寻址,并进行读写操作的电脑部件。以下是整理的电脑内存条的作用,欢迎大家阅读!

学习

吉林市旅游攻略大全

阅读(50)

本文为您介绍吉林市旅游攻略大全,内容包括吉林市旅游攻略,吉林市旅游指南。旅游攻略的目的是把自己的旅程描述出来,为其他要去同一个目的地的游客提供帮助。下面为大家带来吉林市旅游攻略大全,仅供参考,希望能够帮到大家。

学习

天使的翅膀的歌词

阅读(31)

本文为您介绍天使的翅膀的歌词,内容包括天使的翅膀的歌词完整版,天使的翅膀的歌词意思。《天使的翅膀》是由徐誉滕作词作曲,安琥演唱的一首歌曲,收录在安琥2007年发行的同名专辑《天使的翅膀》中。下面是整理收集的天使的翅膀的歌词,欢迎阅

学习

我的乐高作文(精选)

阅读(31)

本文为您介绍我的乐高作文(精选),内容包括乐高作文,我的乐高作文500字。在日常学习、工作抑或是生活中,大家都不可避免地要接触到作文吧,作文是从内部言语向外部言语的过渡,即从经过压缩的简要的、自己能明白的语言,向开展的、具有规范语法结

学习

华为手机释放内存方法

阅读(49)

本文为您介绍华为手机释放内存方法,内容包括华为手机释放内存,华为释放手机内存的好方法。电脑或智能设备等系统运行有些软件时会占的内存,退出后却不能及时释放其所占用的内存,电脑或智能设备运行时间越久,类似此类的内存占用越多。以下是

学习

雕刻心中的天使作文

阅读(28)

本文为您介绍雕刻心中的天使作文,内容包括雕刻心中的天使作文600字,雕刻心中的天使作文立意。在日常学习、工作或生活中,大家对作文都再熟悉不过了吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向。相信写作文是一个

学习

我想更懂你歌词

阅读(126)

本文为您介绍我想更懂你歌词,内容包括我想更懂你歌词完整版,我想更懂你歌词意思。导语:这,是潘玮柏的歌,开始,真的不体会是什么含义,因为我一直都没考虑到,这,是一首写母子之间的歌。以下为大家介绍我想更懂你歌词,欢迎大家阅读参考!

学习

苹果iPhone6s怎么清理内存

阅读(46)

iOS8中可以很容易看出是谁吃了你的存储空间,只要删除那个最胖的文件就可以很轻松的释放更多的存储空间。下面和jy135一起看看吧!欢迎阅读!

学习

《芋老人传》阅读答案及译文解析

阅读(49)

《芋老人传》阅读答案及译文解析篇1芋老人者,慈水祝渡人也。子佣出独与妪居渡口一日有书生避雨檐下衣湿袖单影乃益瘦老人延入坐知从郡城就童子试归老人略知书与语久命妪煮芋以进。尽一器,再进,生为之饱,笑曰:“他日不忘老人芋。”雨止,别去。

学习

解析Mac电脑变卡变慢的解决办法

阅读(134)

不管是什么电脑,只要用的时间长了,多多少少都会有一些问题,更容易发生故障。有时候电脑变慢了,并不是暗示你要买新机的信号。电脑变慢有很多原因,只有在知道原因之后你才能够对症下药,让电脑重新恢复活力。那么,Mac电脑变卡变慢怎么办呢?看看网

学习

如何获得德国绿卡方法解析

阅读(28)

本文为您介绍如何获得德国绿卡方法解析,内容包括怎么才能拿到德国绿卡,在德国拿到绿卡父母能长居吗。关于德国留学的情况,以下是帮大家整理的如何获得德国绿卡方法解析,欢迎大家借鉴与参考,希望对大家有所帮助。

学习

徐州沛县实验小学西校区学区划分

阅读(28)

本文为您介绍徐州沛县实验小学西校区学区划分,内容包括徐州沛县小学学区划分,沛县碧桂园对应的学区是哪里。沛县实验小学,位于江苏省徐州市沛县正阳北路2号,是江苏省首批认定的实验小学。下面是为大家整理徐州沛县实验小学西校区学区划分

学习

医学论文杂志的级别划分

阅读(97)

本文为您介绍医学论文杂志的级别划分,内容包括医学论文的级别及分类,医学信息杂志是什么级别的刊物。医学论文发表到什么样的杂志上最好?一直是客户关心的问题,那么,如何选择要发表的合适的级别,首先我们了解一下杂志级别的划分。

学习

新高考改革录取分数线怎么划分

阅读(30)

本文为您介绍新高考改革录取分数线怎么划分,内容包括新高考改革分数线怎么算,新高考改革录取分数。随着新高考改革的持续发展,很多省份的学生和家长都在疑惑为什么要做高考制度的改革,文理分科究竟哪里不好非要改成自由组合的形式,其实这些

学习

如东中学学区划分标准

阅读(1438)

本文为您介绍如东中学学区划分标准,内容包括如东中学学区划分,如东初中学区划分。小学,是人们接受初等正规教育的`学校,是基础教育的重要组成部分。接下来为大家整理出如东中学学区划分标准,希望大家喜欢!