对应指令码 助记符 说明0x00 nop 什么都不做0x01 aconst_null 将null推送至栈顶0x02 iconst_m1 将int型-1推送至栈顶0x03 iconst_0 将int型0推送至栈顶0x04 iconst_1 将int型1推送至栈顶0x05 iconst_2 将int型2推送至栈顶0x06 iconst_3 将int型3推送至栈顶0x07 iconst_4 将int型4推送至栈顶0x08 iconst_5 将int型5推送至栈顶0x09 lconst_0 将long型0推送至栈顶0x0a lconst_1 将long型1推送至栈顶0x0b fconst_0 将float型0推送至栈顶...
新生代满了会触发 Young GC,老年代满了会触发 Old GC。GC时会回收对象,那么具体是什么样的对象会被垃圾回收器回收呢?可达性分析算法,判断是否被 GC Roots 引用
判断引用类型:强引用、软引用、弱引用、虚引用
是否调用finialize()方法自救首先,JVM 会通过可达性分析算法来判断哪些对象会被回收,哪些不会被回收。可达性分析算法会从一个对象触发,一层层向上,分析有谁在引用它,看是否有一个 GC Roots。
被 GC Roots 引用的对...
前言:新生代的收集器有:Serial,ParNew,Parallel Scavenge等。老年代有:CMS,SerialOld,Paraller Old等。接下来将深入理解各个垃圾收集器的原理,以及它们如何在不同场景下进行搭配使用。 同时,先解释几个名次: 并行(Parallel):多个垃圾收集线程并行工作,此时用户线程处于等待状态 并发(Concurrent):用户线程和垃圾收集线程同时执行 吞吐量:运行用户代码时间/(运行用户代码时间+垃圾回收时间)(一) 新生代的收集器们...
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变成了下面的样子。 同样,根据摩尔定律,我们知道...
如何判断对象是否被持有引用?引用计数算法定义:引用计数算法(Reference Counting):给对象添加一个引用计数器,每当一个地方引用它时,计数器值就+1;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能被再使用的。优点:实现简单,判定效率高;微软的COM技术、Python中都使用了Reference Couting算法进行内存管理。缺点:由于其很难解决对象之间相互循环引用的问题,主流Java虚拟机里面都没有选用Refrence Couti...
1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。 (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。 (3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器...
一、oop-klass描叙
1、介绍
? 在JVM内存用到了oop-klass模型来描叙对应的类及对象:oop(ordinary object ponter,普通对象指针),其是用来描叙对象的实例信息。klass,其是JVM内部用来描叙类的信息的,例如Java类的继承信息,成员方法等信息。同时JVM还有一种类型来封装对oop类型的行为-handle。2、handle
class Handle VALUE_OBJ_CLASS_SPEC {private:oop* _handle;protected:oop obj() const { r...
JVM 内存区域1、程序计数器
这是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器,指的是上次代码被执行的地方,线程私有。
2、Java 虚拟机栈
它是 Java方法执行的内存模型,每一个方法被调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程,线程私有。
3、本地方法栈
跟虚拟机栈类似,不过本地方法栈用于执行本地方法,线程私有。
4、Java 堆
该区域存在的唯一目的就是存...
通过上篇文章,我们知道在JVM中对象的分配、哪些对象是需要回收以及垃圾回收器中用到的算法,这篇文件主要讲解在JVM中所有的垃圾回收器以及各个垃圾回收器是如何回收
一:垃圾收集器搭配以及概念
如图所示,按照对空间的划分垃圾收集器可分为年轻代和老年代垃圾收集器
年轻代收集器:Serial、ParNew、Parallel Scavenge
老年代收集器:CMS、Serial Old、Parallel Old
整堆收集器:G1
并行收集器:指多条垃圾收集线程并行工作,但此...
概述https://www.toutiao.com/i6731345429574713868/
java发展历史上出现过很多垃圾回收器,各有各的适应场景,不仅仅是开发,作为运维也需要对这方面有一定的掌握,今天简单介绍一下java的内存布局以及各种垃圾回收器的原理。JVM内存布局
JVM从概念上大致分为6个(逻辑)区域:
这6块区域按是否被线程共享,可以分为两大类: 一类是每个线程所独享的:
1)PC Register:也称为程序计数器, 记录每个线程当前执行的指令信。eg:...
概述虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向...
先打断点systemDictionary.cpp 1915行Universe::fixup_mirrors(CHECK);进入void Universe::fixup_mirrors(TRAPS) {// Bootstrap problem: all classes gets a mirror (java.lang.Class instance) assigned eagerly,// but we cannot do that for classes created before java.lang.Class is loaded. Here we simply// walk over permanent objects created so far (mostly classes) and fixup their mirrors. Note// that the numb...
栈内存: 程序在栈内存中运行 栈中存的是基本数据类型和堆中对象的引用 栈是运行时的单元 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据 一个线程一个独立的线程栈 堆内存: 程序运行所需的大部分数据保存在栈内存中 堆中存的是对象 堆是存储的单元,堆只是一块共享的内存 堆解决的是数据存储的问题,即数据怎么放,放在哪儿 所有线程共享堆内存 Java中的参数传递( 传值呢?还是传引用? ): 程序运行永远都是在栈...
JVM在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。运行时数据区域这些组成部分一些事线程私有的,其他的则是线程共享的。
线程私有的:程序计数器虚拟机栈本地方法栈线程共享的:堆方法区直接内存程序计数器程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程...
1、场景通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出. 对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策。这时候怎么办呢?可以使用linux下的mat,既Memory Analyzer Tools 2、dump生成dump可以是内存溢出时让其自动生成,或者手工直接导。配置jvm参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/biapp/m.hprof 手工直接导,PID为进程号jmap -dump:live,format=b,fil...