jvm
Alphr
这个作者很懒,什么都没留下…
展开
-
Java虚拟机:方法区,永久代,元空间
1.什么是方法区方法区是java虚拟机规范去中定义的一种概念上的区域,具有什么功能比如:方法区是可供各线程共享的运行时内存区域,存储了存储了类的元数据信息、静态变量、即时编译器编译后的代码(比如spring 使用IOC或者AOP创建bean时,或者使用cglib,反射的形式动态生成class信息等) 等,但并没有规定这个区域到底应该位于何处,为了与堆进行区分,通常又叫“非堆”2.什么是永久代...原创 2020-02-22 19:11:53 · 762 阅读 · 0 评论 -
怎么理解内存溢出和内存泄漏
内存溢出(OOM)内存溢出是引发程序崩溃的罪魁祸首之一,当应用程序内存增长速度非常快,造成的垃圾速度已经跟不上内存消耗的速度,容易出现内存溢出问题,大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就触发Full GC,这时候会回收大量的内存,供程序继续使用javadoc对OutOfMemoryError的解释是:没有空闲内存,并且垃圾回收器也无法提供更多内存没有空闲内存一般有两种情况:Java虚拟机的堆内存设置不够代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用),原创 2020-05-27 15:37:41 · 487 阅读 · 0 评论 -
关于GC垃圾回收及其算法的一点思考
在学过java一些有关GC以及相关算法后,对一些概念以及GC与垃圾回收算法的关系有点混乱,觉得有必要好好总结一下了,虽然GC诞生的时间比java早,并且GC并不是java语言所独有的,但垃圾收集机制是java语言的招牌能力,极大的提高了开发效率,并且成为现代语言的标配,因此我们必须深入学习java的垃圾收集机制1.什么是GC,什么是垃圾,为什么需要GCGC是指垃圾回收机制,所谓垃圾是指在运行程序中没有任何指针指向的对象当一个对象不能再被复后续程序所引用到时,这个对象所占用的内存空间就没有存在的意义了,原创 2020-05-24 19:10:29 · 284 阅读 · 0 评论 -
垃圾收集算法-如何判定对象死亡
在堆中存放着几乎所有的java对象实例,在GC执行垃圾回收之前,首先要区分出那些对象存活,哪些对象死亡,只有被标记为死亡的对象,GC才会在垃圾回收时释放其所占用的内存空间,这个过程被称为垃圾标记阶段在jvm中,当一个对象已经不再被任何存活的对象继续引用时,就可以被宣判死亡,判断对象存活一般有两种方式:引用计数法可达性算法1.不被java采用的引用计数法引用计数法(Reference Counting),其实现过程相对简单:对每个对象保存一个整形引用计算器属性,用于记录对象被引用的情况,举个例子原创 2020-05-24 12:22:25 · 261 阅读 · 0 评论 -
jvm执行引擎:后端编译的运行过程和原理
文章目录1.概述2.解释器和编译器概述3.java是半编译半解释型语言3.1关于java跨平台性的补充4.HotSpot中的解释器和JIT编译器5.判断是否使用JIT编译器5.1方法调用计数器5.2热度衰减5.3设置程序执行方式6.JIT编译器分类1.概述jvm将java字节码文件转换为与当前平台相关的二进制机器码的过程,是由jvm中的执行引擎来处理,与javac将java文件转化为.class文件的前端编译不同,javac并不处于jvm体系,且执行引擎是java虚拟机核心组成部分之一,它的任务是将字节原创 2020-05-23 16:31:39 · 462 阅读 · 0 评论 -
jvm中对象是怎么存储的,对象的内存布局是怎样的
对象通过new,反射,clone等方式创建完毕后被存储到堆中,那么对象是以什么样的方式存储在堆中的?对象的内存布局对象在堆内存的内存布局主要有三部分,即对象头,实例数据,对其填充对象头对象头主要包含两部分的内容,一个叫运行时元数据(mark word),一个叫类型指针1.运行时元数据:哈希值(hashcode):对象在堆空间中都有一个首地址值,栈空间的引用根据这个地址指向堆中的对象,这就是哈希值起的作用GC分代年龄:对象首先是在Eden中创建的,在经过多次GC后,如果没有被进行回收,就会在原创 2020-05-23 09:40:33 · 1317 阅读 · 1 评论 -
方法区的垃圾回收
在《java虚拟机规范》中,并没有强制要求堆方法区实现垃圾回收,不同落地实现的虚拟机可以选择实现或者不实现方法区的垃圾回收,要是不实现垃圾回收的话,那么方法区就成真正意义上的‘永久代’了,对于Hotspot虚拟机来说,它是实现了方法区的垃圾回收的一般来说方法区的回收效果比较令人满意,尤其是类型的卸载,条件非常苛刻,但是是必要的,方法区的垃圾收集主要分为两部分内容:常量池中废弃的常量不再使用的类型首先我们需要知道,方法区内常量池中存放的两大类常量,字面量和符号引用,字面量比较接近于java语言层次原创 2020-05-22 22:39:23 · 302 阅读 · 0 评论 -
jvm-堆详解
文章目录1.堆概述2.堆内存细分2.1设置堆内存大小2.2新生代和老年代3.对象分配过程3.1对象分配特殊情况4.几种垃圾收集比较4.1Minor GC4.2Major GC4.3Full GC5.为什么要分代6.本地线程缓冲TLAB6.1为什么要有TLAB(Thread Local Allocation Buffer)6.2什么是TLAB7.堆是否是对象存储的唯一选择7.1逃逸分析7.2栈上分配7.3同步省略7.4标量分配1.堆概述方法区和堆是线程共享的,是每个进程唯一的,一个java程序对应一个进原创 2020-05-22 17:08:27 · 639 阅读 · 1 评论 -
Java内存模型-JMM解析
1.前言在解析JMM之前,我们首先要明确,java并发编程说到底就是为了处理两个关键问题:线程之间通信线程之间同步我们先简要概述一下,在彻底了解了java内存模型之后,我们可以往更深层次进行探究,那么开始:线程通信指线程之间的信息交互,由于线程里的内容是线程私有的,所以必须通过一些手段达到信息交换的目的,这里有两种:共享内存和消息传递,其中共享内存会在本文重点介绍,并且也是java...原创 2020-04-27 22:41:16 · 264 阅读 · 0 评论 -
通过字节码分析-java静态方法为何不能被重写,重写和重载的本质
在进行文章论点分析之前,我们先要回顾一下方法调用过程,阅读本文需要对jvm有一定了解方法调用方法调用一般发生在一个方法调用另一个方法中,所有方法的执行过程都是通过栈来完成,栈帧的出栈/入栈对应着方法的调用和卸载,在程序运行时,方法调用是最普遍,最频繁的的操作之一,下图揭示了jvm中方法调用的模型图方法调用分类jvm在运行中会把符号引用转化为方法的直接引用对于在编译期就确定,且在运行过...原创 2020-04-23 15:20:24 · 973 阅读 · 0 评论 -
Java虚拟机-pc寄存器执行过程理解
概述在java虚拟机中,程序计数寄存器的命名源于cpu的寄存器,cpu只有把数据装载到寄存器才能够运行,Java虚拟机中的pc寄存器并不是物理层面上的寄存器,而是一种抽象模拟pc寄存器在jvm的位置:作用每个线程都有属于自己的程序计数器,和线程的生命周期一致,程序在执行时的各种功能都要依靠这个pc寄存器,字节码解释器工作时就是通过改变这个计数器来选取下一条需要执行的字节码指令需要注...原创 2020-04-21 19:05:56 · 613 阅读 · 0 评论 -
关于Slot的理解和jclasslib的使用
在局部变量表中,可以使用插件jclasslib来分析字节码,具体使用步骤如下:1.打开idea,安装插件2.Slot的理解局部变量表以变量槽(slot) 为最小单位,这里不过多解释,可以参考虚拟机栈详解,之所以要解释slot,是因为我们往后学习的字节码指令,pc寄存器等都需要这方面的知识,话不多说,图中展示了不同的数据类型占据了不同数量的slot,对应的参数也就发生变化,而java虚拟...原创 2020-04-21 18:09:04 · 795 阅读 · 0 评论 -
java运行时数据区-虚拟机栈详解
1.运行时数据区模型在这个图中,灰色的表示每个线程独有,红色的表示线程共享2.虚拟机栈的特点java虚拟机栈早期也叫java栈,每个线程在创建时都会创建一个虚拟机栈,如图所示多个线程所对应的栈组成了我们所说的java栈,说到栈,就不得不提栈帧,栈帧是java虚拟机最基本的执行单元,一个栈帧对应一个方法,栈帧存储了方法的局部变量表,操作数栈,动态链接和方法返回地址等信息,文章后面会一一介...原创 2020-04-21 16:37:15 · 274 阅读 · 0 评论 -
深入理解java虚拟机类加载机制,通俗易懂
java源文件经编译后以.class的文件形式存在本地磁盘上,在Class文件中描述的各类信息最终都需要加载到虚拟机中之后才能被运行和使用1.类加载机制在jvm中的位置1.类加载过程虚拟机把类的数据从.class文件加载到内存,并对class文件中的数据进行校验、转换、解析、初始化等操作后,最终形成可以被虚拟机识别并使用的Class对象的过程就叫做“虚拟机的类加载”,主要包括为3大阶段。...原创 2020-04-20 21:34:23 · 442 阅读 · 0 评论