JVM
文章平均质量分 61
G_66
这个作者很懒,什么都没留下…
展开
-
Java内存区域-简介
我们从学习Java的第一天开始,老师就告诉我们说,Java语言相比较C或者C++,它有一个非常强大的地方,就是它的内存的管理,我们使用Java不需要自己来申请内存、释放内存等等,这一切的工作都由Java虚拟机来帮助我们完成,发现我们在写代码的过程中也就不需要再管理我们的内存了,但是,随着我们学习的深入,我们始终会出现一些莫名的问题,比如说内存的溢出,等等,那么,我们就开始注意到Java虚拟机了,这...原创 2018-11-18 13:20:14 · 252 阅读 · 0 评论 -
(36讲)垃圾回收算法——复制算法
我们上一节已经了解过垃圾回收算法的第一种,叫做标记-清除算法,这种算法有两大问题,第一大问题就是它的效率问题,我们本节课来讲另外一个垃圾回收算法,就是叫做复制算法,这个算法就是来解决标记-清除算法的效率问题的,在讲复制算法之前,我们再来回顾一下,Java虚拟机的内存结构,Java虚拟机的内存从大的方面来讲,主要分两大块,一块是被线程所共享的,另外一块是线程所独享的区域。被线程所共享的区域,主要有两...原创 2019-01-16 20:01:45 · 2813 阅读 · 2 评论 -
(35讲)垃圾回收算法——标记清除算法
我们之前已经了解了垃圾回收中如何判定对象是垃圾对象的一些常用的算法,那么,我们找到了要回收的对象之后,我们下一步就要对它进行回收了,从本节课开始,我们来了解一下关于垃圾回收的一些常用的算法,垃圾回收的算法,我们之前也说过了,一般来说有四个,分别是,标记-清除算法,复制算法,标记-整理算法,分代收集算法 我们本节主要来学习第一个,标记-清除算法,这一个算法可以说是以下所有算法的基础,它相对来...原创 2019-01-16 19:51:12 · 6657 阅读 · 8 评论 -
(34讲)垃圾回收——判断对象是否存活算法-可达性分析法详解
对于验证对象是否为垃圾对象的算法,有两种,一种是引用计数法,另一种是可达性分析法,我们上一节已经对引用计数法做了一个详细的介绍,本节课来了解一下可达性分析法,我们知道,引用计数法存在一个非常大的问题,就是说,当对象进行循环引用的时候,它就不能分析出来这个对象是否为垃圾对象,虽然它具有简单性和灵活性,但是我们一般情况下来讲,是不采用引用计数法的,通过上一节的例子也给大家说明了,那么,另外一种就是可达...原创 2019-01-16 19:49:47 · 3321 阅读 · 4 评论 -
垃圾回收——判断对象是否存活算法-引用计数法详解
垃圾回收首要的任务就是确定哪些对象是垃圾,哪些对象可进行回收,上节课我们也说过了,判定对象为垃圾对象的两种算法,一种是引用计数法,另一种是可达性分析法,我们本节课就来详细的了解一下什么是引用计数法。引用计数法的思路是,在对象中添加一个引用计数器,当有地方引用这个对象的时候,这个引用计数器的值就加1,当引用失效的时候,这个引用计数器的值就减一。那么,什么时候是引用失效呢?比如说把那个对象的值...原创 2018-11-24 23:00:03 · 442 阅读 · 1 评论 -
垃圾回收——概述
我们之前对Java虚拟机已经有了一定的了解,而且,对Java虚拟机的内存结构以及对象,都有了一定的了解之后,我们来看垃圾回收,我们在写Java应用的时候,内存都是由Java虚拟机来进行管理的,不管是申请内存也好,还是释放内存也好,都不需要我们程序员来进行处理,Java虚拟机就给我们处理完毕了,那么,我们在一般情况下来进行开发的过程中,我们是不需要关注这一块内容的,但是,话又说回来,如果我们遇到了一...原创 2018-11-24 22:40:07 · 244 阅读 · 0 评论 -
对象在内存中的布局——对象的创建
我们在任何一个项目中,无时无刻不关注对象的创建,时时刻刻都在创建对象,都在使用对象,那么,我们就从虚拟机的角度来看对象的创建。首先,我们知道,创建对象有多种方式,最直观的一种方式就是通过new关键字来创建对象,而且我们之前也提到过了,我们知道,通过new创建一个对象,那么,那个对象就会存储到堆内存中,那么,下面我们就来具体的看一下对象的创建过程这个图表示的就是一个对象的创建过...原创 2018-11-18 15:01:00 · 800 阅读 · 0 评论 -
Java内存区域——直接内存和运行时常量池
运行时常量池是属于方法区的一块,class文件中除了有类的版本、字段、方法、接口等描述信息以外,还有一项信息就是常量池,那么,这个常量池是干什么的呢?它就是用来存放编译期生成的各种字面量以及符号引用,这部分内容将在类加载后,进入方法区的运行时常量池中存放。举个例子基本数据类型和抽象数据类型的引用会放到哪里呢?我们之前所讲的内存区域,随着这个方法的运行,会对每一个方法创建一个栈帧,栈帧里面有...原创 2018-11-18 14:53:13 · 843 阅读 · 0 评论 -
Java内存区域——方法区
存储虚拟机加载的类信息,那么,这个类信息就有哪些信息呢?这里的类信息其实非常多,比如,类的版本,字段,方法,接口,这些描述信息都是属于类的信息。我们所执行的方法其实就会放到方法区中,除了类的信息之外,就是常量,静态变量,即时编译器编译后的代码等数据。这是我们方法区所存储的一些信息方法区和永久代,其实对于我们现在主流的虚拟机,就是我们最熟悉的hosport,那么在hosport上进...原创 2018-11-18 14:49:46 · 704 阅读 · 0 评论 -
Java内存区域——堆内存
Java堆就是存储对象的实例,也就是说,堆的作用是非常单一的,其实就是存放对象的实例这么一个功能,当然了,Java虚拟机的Java堆一般来讲是Java虚拟机所管理的最大的一块内存区域,因为我们在一般的Java应用中,会不停的去创建对象,那么,只要是对象的存储,都会放到堆中,而每一个对象它所使用的内存也是不确定的,既然Java堆这一块区域是所管理的最大的区域,那么,也就是垃圾收集器所管理的主要区域,...原创 2018-11-18 14:48:37 · 284 阅读 · 0 评论 -
Java内存区域——本地方法栈
本地方法栈和虚拟机栈是非常相似的,当然,它们之间也是有不同点的,其中就说,虚拟机栈是为虚拟机执行Java方法服务的,所谓的本地方法栈是为虚拟机执行Native方法服务,说白了,它们的区别也就这一点。其他的,像栈大小的问题,内存溢出的问题,包括栈帧、局部变量表等它们都是完全相同的。...原创 2018-11-18 14:37:20 · 407 阅读 · 0 评论 -
Java内存区域——Java虚拟机栈
Java虚拟机栈这块区域的功能,描述的是Java方法执行的动态内存模型。就是说,一个方法的执行以及执行完毕,那么,整个的内存模型就是在Java虚拟机栈中。每个方法执行都会创建一个栈帧,伴随着方法从创建到执行完成。栈帧是用于存储方法可执行的局部变量表、操作数栈、动态链接,方法出口等。每次方法执行,栈帧都会伴随着一个进栈以及出栈的这么一个过程。我们可以简单的描述一下这个过程,这是我们...原创 2018-11-18 14:12:44 · 429 阅读 · 0 评论 -
Java内存区域——程序计数器
我们这个图这个图中画的大小并不能表示每一块内存区域的大小,这只是一个概念模型,我们只是通过这个图看一下有哪些区域,不要认为在这个图中区域大就认为它所占的内存区域就大。这个怎么理解呢?比如我们随便写一个代码我们在用这个代码的时候,直接运行就可以了,这里先不说这个方法是怎么加到方法栈中的,当我们这个代码在运行的过程中,它是从上往下一行一行的去执行其实这里就用到...原创 2018-11-18 13:27:38 · 643 阅读 · 0 评论 -
(37讲)垃圾回收算法——标记整理算法和分代收集算法
上一节在复制算法中也了解到了,复制算法,它主要是针对新生代内存进行收集的一种算法,它有一个假定,每次回收,最后存活的概率是比较小的,一般是在百分之十左右,超过百分之十我们需要内存担保,就需要额外申请内存,这个过程如果对于新生代内存当然是可以的,这种算法是比较高效的,但是对于老年代内存怎么办呢?这个时候就会出问题,我们说老年代内存一般是回收的效率是非常低的,就是说,可能有百分之九十的存活,那么,这个...原创 2019-01-16 20:03:13 · 887 阅读 · 1 评论