
聊聊jvm
飞上天的橘子
努力做一个能上天的橘子
展开
-
九、垃圾收集器简述
垃圾收集的历史十分的久远,在1960年诞生于麻省理工学院的Lisp是第一门开始使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,其作者John McCarthy就思考过垃圾收集器需要完成主要的三件事:哪些内存需要回收?什么时候回收?如何回收?现如今的内存分配和内存回收技术已经相当成熟,我们去了解垃圾收集和内存分配主要是为了,当需要排查各种内存溢出、内存泄漏的问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们必须对这些“自动化”的技术实施必要的监控和调节。回到Java上,前面我原创 2021-06-19 22:27:32 · 147 阅读 · 0 评论 -
八、对象的内存布局
在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头对象头主要分为两类信息:第一类是用于存储自身的运动时数据。如:哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有锁、偏向线程ID、偏向时间戳等,这部分数据长度在32位和64位的虚拟机中分别为32个比特和64个比特。官方称它为“Mark Word”。对象需要存储的运行时数据其实很多,但对象头例的信息与对象本身定义的数据原创 2021-06-17 15:09:09 · 589 阅读 · 2 评论 -
七、浅谈java对象在虚拟机中的创建
Java是一门面向对象的编程语言,Java程序每时每刻都有对象被创建出来。在语言层面上,创建对象通常仅仅通过一个new关键字即可。当然还包括复制、反序列化等。而在虚拟机中,对象是如何创建的呢?让我们先初略的探索一下。当Java虚拟机遇到一条字节码new指令时,首先会去检查指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号应用的代表类是否已经被加载、解析和初始化过。如果没有则执行响应的类加载过程。当类加载完成后,接下来虚拟机会为新生的对象分配内存。对象所需的内存大小在类加载完之后便可完全确原创 2021-06-17 11:54:55 · 147 阅读 · 0 评论 -
六、方法区
方法区(Method Area)方法区和Java堆一样,是各个线程共享的内存区域,主要用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。在《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但方法区有一个别名:Non-Heap 。目的就是与Java堆分开。在JDK8以前,大多数程序员都习惯使用HotSpot虚拟机上开发和部署程序,当时大家把“方法区”和“永久代”混为一谈。因为当时HotSpot虚拟机的设计团队使用永久代去实现了方法区,这样使得HotSpot的垃原创 2021-06-11 16:51:42 · 154 阅读 · 0 评论 -
五、Java堆
Java堆对于Java应用程序来说,Java堆 是虚拟机所管理的内存中最大的一块。堆,是被所有线程共享的一块内存区域,在虚拟机启动时创建。堆,唯一的目的就是存放对象实例,Java世界中“几乎”所有的对象实例都是在这里分配内存的。在《Java虚拟机规范》中对Java虚拟机的描述是:“所有的对象实例以及数组都应当在堆上分配”。但随着语言的不断进步,即使只考虑现在,由于技术编译技术的进步,尤其是逃逸分析技术的日渐强大,栈上分配。标量替换优化手段已经导致一些微妙的变化,所以说Java对象实例都分配在堆上变得原创 2021-06-11 15:27:54 · 439 阅读 · 0 评论 -
四、本地方法栈
本地方法栈和虚拟机栈所发挥的作用差不多,虚拟机栈是为执行Java方法服务的,而本地方法栈视为虚拟机使用本地方法服务的。东西好少,补一张男神照片。。。原创 2021-06-11 14:34:13 · 105 阅读 · 1 评论 -
三、虚拟机栈
虚拟机栈(Java Virtual Machine Stack)虚拟机栈和程序计数器一样,都是线程私有的。它的生命周期和线程相同。虚拟机栈是描述Java方法执行的线程内存模型,每个方法执行时,JVM都会同步创建一个栈帧(Stack Frame)。栈帧主要用于存储局部变量表,操作数栈,动态连接,方法出口等信息。每个方法从被调用到结束,就对应着一个栈帧从入栈到出栈的过程。我们通常讲的栈,更多情况下是指栈帧中的局部变量表。局部变量表中包括了:基本数据类型、对象引用和ReturnAddress类型。基原创 2021-06-11 14:22:13 · 116 阅读 · 1 评论 -
二、程序计数器
程序计数器(Program Counter Register)内存中一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变程序计数器的值来获取下一条需要执行的字节码指令的。它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基本功能都是要依赖这个计数器完成的。由于Java虚拟机的多线程是由线程轮流切换。分配处理器执行时间来实现的。所以,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各原创 2021-06-11 13:31:50 · 321 阅读 · 2 评论 -
一、JVM运行时数据区
Java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有着各自的用途,以及创建时间和销毁时间,有的区域会跟随虚拟机进程一直存在,有些区域则依赖用的线程的启动和结束而建立和销毁。具体划分如下图:...原创 2021-06-11 11:03:03 · 1057 阅读 · 2 评论