
jvm内存模型
代码造就世界
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
jvm培训:JVM的背景知识
JVM堆内存划分 新生代(YoungGeneration) 新生代内被划分为三个区:Eden,fromsurvivor,tosurvivor。大多数对象在新生代被创建。MinorGC针对的是新生代的垃圾回收。 老年代(OldGeneration) 在新生代中经历了几次MinorGC仍然存活的对象,就会被放到老年代。MajorGC针对的是老年代的垃圾回收。本文重点分析的CMS就是一种针对老年代的垃圾回收算法。另外FullGC是针对整堆(包括新生代和老年代)做垃圾回收的。 永久代(Perm原创 2020-12-29 13:45:29 · 201 阅读 · 0 评论 -
jvm培训:Java对象的创建过程
Java对象创建的过程,总共来说分为五部分; 类加载过程 当虚拟机遇到一条new指令时,它将首先检查该指令的参数是否可以在常量池中找到该类的符号引用,并检查该符号引用表示的类是否已被加载,解析和初始化。。如果不是,则必须首先执行相应的类加载过程。 分配内存 通过类加载检查后,虚拟机将为新对象分配内存。可以在加载类之后确定对象所需的内存大小。为对象分配空间的任务等效于从Java堆中分配一定大小的内存。有两种分配方法:“指针冲突”和“空闲列表”。分配方法的选择取决于Java堆是否正常,而Jav原创 2020-12-28 14:07:16 · 120 阅读 · 0 评论 -
jvm培训:jvm类的初始化
来说说类加载过程的最后一个阶段,类初始化。对于类初始化来说,有一个特殊的初始化方法叫(对象实例化的方法叫),这个名称是由编译器提供的,我们没法显示调用。 一、触发初始化。 当执行以下操作的时候,会调用方法: 1、当对类C进行方法/字段的直接或者间接引用,jvm第一次执行new/putstatic/getstatic/invokestatic(就是new一个C对象,或者是对类C中的静态变量存或者取的时候,亦或者是调用类C的静态方法时) 2、使用Class.forName,反射的时候(如果指定转载 2020-12-25 13:41:12 · 333 阅读 · 0 评论 -
jvm培训:类加载器和双亲委派机制
我们都知道了类加载的时间点,那么jvm是通过什么方式对类进行加载的呢?就是类加载器。 那接下来我们就来聊聊jvm的类加载器。 jvm培训 jvm的类加载器总体上可以分成4层,我们一起看一下。 1.启动类加载器 首先是JVM启动的第一步,即BootstrapClassLoader,它主要用于加载Java的核心类。 我相信每个人都知道,无论运行Java程序的链接是什么,都必须安装jvm虚拟机环境,并且该环境的目录中有一个lib文件夹。该文件是核心Java类库。支持java系统的运行。转载 2020-12-23 13:47:10 · 131 阅读 · 0 评论 -
jvm培训:jvm调优为什么要把堆和栈区分出来呢
首先,从软件设计的角度来看,堆栈代表处理逻辑,而堆代表数据。这种分离使处理逻辑更加清晰。分而治之的想法。隔离和模块化的想法反映在软件设计的各个方面。 其次,堆和堆栈的分离允许堆的内容由多个堆栈共享(也可以理解为访问同一对象的多个线程)。这种共享的好处很多。一方面,这种共享提供了一种有效的数据交互方式(例如共享内存),另一方面,所有堆栈都可以访问堆中的共享常量和缓存,从而节省了空间。 第三,由于运行时的需要(例如保存系统操作的上下文),需要将堆栈分为地址段。由于堆栈只能向上生长,因此限制了堆栈存储内转载 2020-12-21 13:41:48 · 475 阅读 · 0 评论 -
jvm培训:为什么需要分代垃圾收集?
一步一步地标记和压缩Java虚拟机中的所有对象的效率非常低:分配的对象越多,垃圾收集所花费的时间就越长。但是,根据统计数据,大多数对象在很长一段时间内都不会有用。 来看个例子吧。(下图中,竖轴代表已分配的字节,而横轴代表程序运行时间) 上图可见,存活(没被释放)的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。 JVM分代 根据之前的规律,就可以用来提升JVM的效率了。方法是,把堆分成几个部分(就是所谓的分代),分别是新生代、老年代,以及永生代。 新对转载 2020-12-18 13:58:26 · 382 阅读 · 0 评论 -
jvm培训:判断对象是否存活的算法
1、引用计数法 引用计数方法的实践是为每个对象添加一个引用计数器,以对指向该对象的引用数进行计数。当有对对象的引用时,计数器增加1,当引用无效时,计数器减少1,并且对象计数器是否为0以确定对象是否可以回收。一旦对象的引用计数器为0,则意味着该对象已死并且可以回收。 (1)具体实现如果有一个引用,被赋值为某一对象,那么该对象的引用计数器+1。如果一个指向某一对象的引用,被赋值为其他值,那么将该对象的引用计数器-1。也就是说,我们需要截获所有的引用更新操作,并且相应的增减目标对象的引用计数器。 (2转载 2020-12-17 13:30:09 · 126 阅读 · 0 评论 -
jvm内存模型:垃圾回收的基本概念
我们都知道调用System.gc()方法只是通知系统去回收,是否回收不能确定。 回收的判断 JVM中,将一个对象真正回收需经历两次标记过程,每次都是先判断对象有没有被持有引用,再判断对象是否必要执行finalize()方法。 持有判断。最先使用是引用计数算法,当对象有一个引用,即增加一个计数;删除一个引用,即减少一个计数。计数为零的对象,判断为不可用,但是无法处理循环引用的问题。现主流的都是可达性分析算法,通过将一系列称为GCRoots的对象作为起始点,开始向下搜索,走过的路径则是引用链。若所有转载 2020-12-14 14:33:57 · 125 阅读 · 0 评论 -
jvm培训:Linux与进程内存模型
JVM以一个进程(Process)的身份运行在Linux系统上,了解Linux与进程的内存关系,是理解JVM与Linux内存的关系的基础。 下图给出了硬件、系统、进程三个层面的内存之间的概要关系。 从硬件的角度来看,Linux系统的内存空间由两部分组成:物理内存和SWAP(位于磁盘上)。物理内存是Linux活动期间使用的主要内存区域。当物理内存不足时,Linux会将部分暂时未使用的内存数据放入磁盘上的SWAP中,以释放更多的可用内存空间;以及何时需要使用SWAP中的数据时,必须首先将其改回内存。转载 2020-12-12 13:54:47 · 183 阅读 · 0 评论 -
jvm内存模型:jvm的理解
JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM的主要功能就是把字节码解释成机器能识别的机器码。 Java语言相比于其他语言有一个最重要的优点——跨平台运行,java程序只需要写一次,就可以在不同的操作系统上运行,即我们经常说的"一次编译,到处运行",使用JVM就是为了支持java语言与操作系统无转载 2020-12-11 17:07:25 · 281 阅读 · 1 评论 -
jvm内存模型:复制算法
为了解决效率问题,出现了一种称为“复制”(Copying)的收集算法,该算法根据容量将可用内存分为两个大小相等的块,一次仅使用一个。当该内存块用完时,会将尚存的对象复制到另一个块,然后立即清除已用的内存空间。 这样,每次都回收一个内存,并且在分配内存时无需考虑复杂的情况,例如内存碎片。只要移动堆顶部的指针并按顺序分配内存,实现就很简单并且操作效率很高。只是该算法的代价是将内存减少到一半,这太高了。 但是这种算法的效率相当高,所以,现在的商业虚拟机都采用这种收集算法来回收新生代。为什么新生代可以使用转载 2020-12-10 13:43:42 · 682 阅读 · 0 评论 -
jvm内存模型:运行时常量池的理解
运行时常量池是方法区域的一部分。除了在类文件中描述类的版本,字段,方法,接口等之外,还有一个常量池(ConstantPoolTable),用于存储编译期间生成的各种文字和符号引用。。此部分的内容将在加载类后存储在方法区域中的运行时常量池中。 Java虚拟机对Class文件的每个部分(自然包括常量池)的格式都有严格的规定。每个字节用于存储的数据类型必须符合规范的要求,以便虚拟机可以识别它。加载并执行。但是对于运行时常量池,Java虚拟机规范没有提出任何详细要求。由不同提供程序实现的虚拟机可以根据自己的需转载 2020-12-09 13:22:15 · 341 阅读 · 0 评论 -
JVM内存模型:堆空间的认识
Java中的堆空间用于存储对象实例和数组(当然,数组引用存储在Java堆栈中)。所有线程都共享堆,因此需要锁定对象内存的分配,这也导致新对象的开销相对较大。JVM中只有一个堆空间。堆空间是Java垃圾收集器管理的主要区域,Java的垃圾收集机制将自动处理它。 为了提高对象内存分配的效率,SunHotspotJVM为创建的线程分配了一个单独的空间TLAB(线程本地分配缓冲区),该空间的大小由JVM根据运行情况来计算,而不是在TLAB上分配对象时需要。锁定,因此当为线程对象分配内存时,JVM将在TLAB上转载 2020-12-08 13:56:02 · 178 阅读 · 0 评论