首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《我想进大厂》之JVM夺命连环10问

局部变量表用于存储方法参数和局部变量。当第一个方法被调用的时候,他的参数会被传递至从0开始的连续的局部变量表中。...操作数栈用于一些字节码指令从局部变量表中传递至操作数栈,也用来准备方法调用的参数以及接收方法返回结果。 动态连接用于将符号引用表示的方法转换为实际方法的直接引用。...准备:为静态变量、常量赋默认值 解析:把常量池中符号引用(以符号描述引用的目标)替换为直接引用(指向目标的指针或者句柄等)的过程 初始化:执行static代码块(cinit)进行初始化,如果存在父类,...当类加载完成之后,紧接着就是对象分配内存空间和初始化的过程 首先为对象分配合适大小的内存空间 接着为实例变量赋默认值 设置对象的头信息,对象hash码、GC分代年龄、元数据信息等 执行构造函数(init...当一个新的对象来申请内存空间的时候,如果Eden区无法满足内存分配需求,则触发YGC,使用中的Survivor区和Eden区存活对象送到未使用的Survivor区,如果YGC之后还是没有足够空间,则直接进入老年代分配

37430

《我想进大厂》之JVM夺命连环10问

局部变量表用于存储方法参数和局部变量。当第一个方法被调用的时候,他的参数会被传递至从0开始的连续的局部变量表中。...操作数栈用于一些字节码指令从局部变量表中传递至操作数栈,也用来准备方法调用的参数以及接收方法返回结果。 动态连接用于将符号引用表示的方法转换为实际方法的直接引用。...准备:为静态变量、常量赋默认值 解析:把常量池中符号引用(以符号描述引用的目标)替换为直接引用(指向目标的指针或者句柄等)的过程 初始化:执行static代码块(cinit)进行初始化,如果存在父类,...当类加载完成之后,紧接着就是对象分配内存空间和初始化的过程 首先为对象分配合适大小的内存空间 接着为实例变量赋默认值 设置对象的头信息,对象hash码、GC分代年龄、元数据信息等 执行构造函数(init...当一个新的对象来申请内存空间的时候,如果Eden区无法满足内存分配需求,则触发YGC,使用中的Survivor区和Eden区存活对象送到未使用的Survivor区,如果YGC之后还是没有足够空间,则直接进入老年代分配

41061
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JVM | 从类加载到JVM内存结构

    准备阶段JVM 为类的静态变量分配内存,并且为它们设置默认值。...在我们的 Building 类中,constructionYear 就是一个静态变量,所以它会在这个阶段被初始化为 0(对于 int 类型,初始化默认值为 0)。...静态变量是属于类的,我们会把它放在元空间中,你看:图片解析阶段JVM 将类的二进制数据中的符号引用替换为直接引用。这个过程是在元空间完成的。...我在上篇文章中说到:如果我们在多线程中使用类加载器,可能会导致类被重复加载多次。除了会浪费资源外,还会导致我们一些静态初始化代码被执行多次。 指的就是。...我们在编写代码的时候可以减少内存开销,我们现在知道类的初始化阶段需要分配内存,如果我们写一个懒加载,在使用时才初始化,那么我们的内存就会减少很多。相信你已经明白它的价值了。

    27540

    谈谈 c# 对象初始化问题 C#对象初始化

    主要区分函数中的变量和对象中的字段的区别。   1、变量声明后,没有进行赋值的含义:     声明未赋值,会无法生成,提示‘使用了未赋值的变量’。     ...通过Reflecter可以看到,声明变量未赋值,实际是不存在的,那么就是说没有进行分配内存。 2、变量赋值为null 表明变量具有内存空间,但是内存中什么也不存在。...在使用引用类型时,存在以下性能问题,这是我们在开发中必须要注意的: a、内存必须从托管堆上分配(也就是说每new一个对象,会占用内存,对象过多就会导致内存占用) b、 堆上分配的每个对象都有一些额外的成员...,这些成员必须初始化 c、对象中的其他字节(为字段而设),总是设为0 d、从托管堆中每分配一个对象,可能强制执行一次垃圾回收操作 所以当我们的应用程序中都是引用类型时,应用程序的性能会显著下降。...2、值类型 上面介绍了引用类型,知道了当从托管堆中每分配一个对象时,都会造成应用程序性能的下降。

    1.7K20

    Java面试——JVM知识

    局部变量表用于存储方法参数和局部变量。当第一个方法被调用的时候,他的参数会被传递至从0开始的连续的局部变量表中。...操作数栈用于一些字节码指令从局部变量表中传递至操作数栈,也用来准备方法调用的参数以及接收方法返回结果。动态连接用于将符号引用表示的方法转换为实际方法的直接引用。...十九、new 一个对象的过程 ---- ? 静态代码块是绝对线程安全的,只能隐式被 java虚拟机在类加载过程中初始化调用!(此处该有问题 static代码块线程安全吗?)...类加载完成后,就是对象分配内存空间和初始化的过程:首先为对象分配合适大小的内存空间,接着为实例变量赋默认值,设置对象的头信息,对象 hash码、GC分代年龄、元数据信息等,执行构造函数(init)初始化...二十、什么时候会触发 YGC和 FGC ---- 当一个新的对象来申请内存空间的时候,如果 Eden区无法满足内存分配需求,则触发YGC,使用中的 Survivor区和 Eden区存活对象送到未使用的

    54210

    java面试题 --- JVM之内存分配

    堆内存是否规整取决于采用的垃圾回收方式是否会生成内存碎片,如果会,是否会对内存碎片进行整理。 3. 你知道指针碰撞和空闲列表分别是怎么去分配内存的吗?...指针碰撞就是 JVM 会维护一个指针,指针的一边是已用的内存,另一边是未用的内存,给对象分配内存时,指针往未使用内存的一端移动,直到内存刚好达到对象所需的内存大小。...了解内存分配的担保机制吗?...优点就是如果对象移动了,存放在栈中的引用不用变,只需改变句柄池中指向实例池的指针即可; 直接指针就是堆内存存放实例数据,同时存放指向方法区的指针,相比句柄寻址这种方式可以减少一次指针定位的开销,我们常用的...对象有四种引用,强软弱虚: 强引用是我们最常用的,内存不足时,JVM 宁愿 OOM,也不会对其进行垃圾回收; 软引用就是当内存不足时,GC 就会对其进行回收; 弱引用就是不管内存够不够,只要 GC 发现了它

    42950

    【C++】42道面试经典问题总结

    的放在了.data段,没有初始化或者初始化为0的放在了.bss端(局部变量不产生符号,在栈上通过ebp-偏移量来访问的) 从面向对象角度来说:static可以修饰成员变量,成员方法(从私有变成共享)修饰成员方法时不会再生成...分开原因:当我们去初始化一个容器时,底层应该是空的,只有内存,没有对象,但是如 果在容器构造时直接用new,不仅会开辟内存还会构造很多无用的对象 。...系统给我们分配了既定大小的内存,但是在访问内存的时候如果超过了既定内存的大小,就是越界访问了 1.访问数组元素越界 2.vector容器访问-vectorwec; wec[2]越界 3.string...,然后指针解引用,访问的内存就会越界 C++中的类的初始化列表?...基类不代表任务实体·,它的主要作用之一就是给所有的派生类保留统一的纯虚函数接口,让派生类进行重写方便多态机制使用。因为基类不需要实例化,它的方法也就不知怎么去实现。

    12510

    2020面试题--小试牛刀

    它的默认值为auto,即项目的本来大小。 它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。...内存泄漏:就是没有使用,或已经使用完的变量,没有及时回收。 (1) 意外的全局变量,初始化未经声明的变量,总是会创建一个全局变量。...基本类型的变量会保存在栈内存中,如果在一个函数中声明一个值类型的变量,那么这个变量当函数执行结束之后会自动销毁 2.引用类型的变量名会保存在栈内存中,但是变量值会存储在堆内存中,引用类型的变量不会自动销毁...,当没有引用变量引用它时,系统的垃圾回收机制会回收它 *问题:知道箭头函数和普通函数的区别吗?...undefined 是 Undefined 类型的唯一值,它表示未定义的值。当声明变量未赋值时,或者定义属性未设置值时,默认值都为 undefined。 *问题:promise是什么?

    1.1K20

    Go语言中new和make的区别

    变量的声明 变量的声明我们可以通过关键字,然后就可以在程序中使用。当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如类型的零值是0,类型的零值是,引用类型的零值是。...以上全错,运行的时候会painc,原因如下: 从这个提示中可以看出,对于引用类型的变量,我们不光要声明它,还要为它分配内容空间,否则我们的值放在哪里去呢?这就是上面错误提示的原因。...现在让我们看下这个内置的函数。 它只接受一个参数,这个参数是一个类型,分配好内存后,返回一个指向该类型内存地址的指针。同时请注意它同时把分配的内存置为零,也就是类型的零值。...我们的例子中,如果没有,那么打印的就是0。这里体现不出来函数这种内存置为零的好处,我们再看一个例子。 示例中的类型中的字段我不用初始化,直接可以拿来用,不会有无效内存引用异常,因为它已经被零值了。...注意,因为这三种类型是引用类型,所以必须得初始化,但是不是置为零值,这个和是不一样的。 从函数声明中可以看到,返回的还是该类型。

    53270

    那些你不知道的类和对象的知识

    ✨ 一、构造函数的深入理解 1.1 初始化列表 前面,我们已经学习过构造函数,在创建对象的时候,编译器会自动调用构造函数,用于给初始化对对象的成员变量赋予初始值.那构造函数体内的语句时初始化吗?...静态成员函数可以直接通过类名进行调用,而不需要创建类的实例对象。 (2)静态成员函数为什么一定要在类外面初始化: C++中的静态成员变量在程序运行时被分配内存,但是它们的定义是在编译时就已经完成的。...在声明静态成员变量时,需要在类的定义中进行,但不能在函数内部进行。在类的定义中声明的静态成员变量不会占用内存空间,只有在类外定义时才会真正地分配内存。...因此,当在程序中第一次使用静态成员变量时,它们才会被真正地生成并分配内存。这通常是在程序的main函数执行之前发生的。如果程序中没有使用静态成员变量,它们可能永远不会被生成。...存储空间分配:静态成员变量需要在内存中分配存储空间,类的定义只是描述了该成员变量的类型和访问方式,只是图纸,并没有分配空间。所以在类外进行初始化方便为其分配存储空间。

    20520

    当你写出User user = new User()时,JVM 都做了些什么

    2、对象的访问 Java程序中我们操作一个对象是通过指向这个对象的引用。我们都知道对象存在堆中,这个引用存在虚拟机栈中。那么引用通过什么方式去定位堆中对象的位置呢?...类加载检查通过后,虚拟机将为新对象分配内存,对象所需内存的大小在类加载后便可以确定。 内存分配完成后,虚拟机需要将对象初始化为零值,保证对象的实例变量在代码中不赋初始值就能直接使用。...类变量的初始化操作在类加载的初始化阶段方法完成 分配内存有两种方式: Java堆内存是规整的(使用标记整理或带压缩的垃圾收集器),使用一个指针指向空闲位置,分配内存既将指针移动与分配大小相等的距离...内存不是规整的(使用标记清除的垃圾收集器),虚拟机维护一个可用内存块列表,分配内存时从列表中找到一个足够大的内存空间划分给对象并更新可用内存列表。...四、创建对象指令重排序问题 A a = new A(); new一个对象的简单分解动作: 分配对象的内存空间 初始化对象 设置引用指向分配的内存地址 其中2、3两步间会发生指令重排序,导致多线程时如果在初始化之前访问对象则会出现问题

    1.3K10

    C++知识概要

    ) 派生类自己的构造函数 必须使用成员列表初始化的四种情况 当初始化一个引用成员时 当初始化一个常量成员时 当调用一个基类的构造函数,而它拥有一组参数时 当调用一个成员类的构造函数,而它拥有一组参数时...数据段属于静态内存分配。 BSS 段 未初始化的数据段。BSS 段(bss segment )通常是指用来存放程序中未初始化的全局变量的一块内存区域。...BSS 段属于静态内存分配(BSS 段 和 data 段的区别是 ,如果一个全局变量没有被初始化(或被初始化为 0),那么他就存放在 bss 段;如果一个全局变量被初始化为非 0,那么他就被存放在 data...注意它与数据结构中的堆是两回事,分配方式倒是类似于链表 全局区(静态区)(static) — 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域...如果引用计数变为 0,shared_ptr 的析构函数就会销毁对象,并释放它占用的内存。 unique_ptr 一个 unique_ptr 拥有它所指向的对象。

    1.1K20

    知识改变命运 第七集(上):Java中数组的定义与使用

    :如果有20名同学成绩呢,需要创建20个变量吗?...1.2 什么是数组 数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。...如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值,比如: 如果数组中存储元素类型为引用类型,默认值为null 1.4 数组的使用 1.4.1 数组中元素访问 数组在内存中是一段连续的空间...比如: 程序运行时代码需要加载到内存 程序运行产生的中间数据要存放在内存 程序中的常量也要保存 有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁 如果对内存中存储的数据不加区分的随意存储...方法编译出的的字节码就是保存在这个区域 现在我们只简单关心堆 和 虚拟机栈这两块空间,后序JVM中还会更详细介绍。

    10810

    JVM之对象的实例化内存布局与访问定位

    如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小 如果内存规整:采用指针碰撞分配内存   1)如果内存是规整的,那么虚拟机将采用的是指针碰撞法(Bump The Point)来为对象分配内存...一般使用带Compact(整理)过程的收集器时,使用指针碰撞   4)标记压缩(整理)算法会整理内存碎片,堆内存一存对象,另一边为空闲区域 如果内存不规整   1)如果内存不是规整的,已使用的内存和未使用的内存相互交错...,那么虚拟机将采用的是空闲列表来为对象分配内存   2)意思是虚拟机维护了一个列表,记录上哪些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。...4、初始化分配到的内存 所有属性设置默认值,保证对象实例字段在不赋值可以直接使用 5、设置对象的对象头 将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中...回顾给对象属性赋值的顺序: 属性的默认值初始化 显示初始化/代码块初始化(并列关系,谁先谁后看代码编写的顺序) 构造器初始化 从字节码角度看 init 方法 代码示例 /** * 测试对象实例化的过程

    5200

    JVM

    其中局部变量表存放线程和方法的参数、方法中定义的基础类型变量和对象引用。由线程私有。生命周期随着线程的创建而创建,随着线程的结束而死亡。...分配内存类加载后,会从 Java 堆中划分一块固定大小的内存区域分配给对象。Copy to clipboardErrorCopiedStep 3....半初始化内存分配完成后,虚拟机将对象的实例数据都半初始化为默认值。此时对象已经可用。Copy to clipboardErrorCopiedStep 4....如果尚未完全初始化就建立了关联,其他线程读取该对象可能会读取到默认值。分配方式内存划分有以下两种分配方式:指针碰撞:(内存规整时) 已使用内存和未使用内存用指针隔开,需要分配内存时将指针移动一定位置。...空闲列表:(内存不规整时)虚拟机维护一个列表记录空闲内存块,需要分配内存时选择合适的内存块。Java 堆是否规整,取决于垃圾收集算法是否整理内存。

    42230

    2019年JVM最新面试题,必须收藏它

    3、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new...当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。...最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。...1)验证,文件格式、元数据、字节码、符号引用验证; 2)准备,为类的静态变量分配内存,并将其初始化为默认值; 3)解析,把类中的符号引用转换为直接引用 初始化,为类的静态变量赋予正确的初始值 使用,new...常见的原因 内存加载的数据量太大:一次性从数据库取太多数据; 集合类中有对对象的引用,使用后未清空,GC不能进行回收; 代码中存在循环产生过多的重复对象; 启动参数堆内存值小。

    63240

    Go语言中new和make的区别

    当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如int类型的零值是0,string类型的零值是"",引用类型的零值是nil。...对于例子中的两种类型的声明,我们可以直接使用,对其进行赋值输出。但是如果我们换成引用类型呢?...,对于引用类型的变量,我们不光要声明它,还要为它分配内容空间,否则我们的值放在哪里去呢?...同时请注意它同时把分配的内存置为零,也就是类型的零值。 我们的例子中,如果没有*i=10,那么打印的就是0。这里体现不出来new函数这种内存置为零的好处,我们再看一个例子。...user类型中的lock字段我不用初始化,直接可以拿来用,不会有无效内存引用异常,因为它已经被零值了。

    38520

    JVM-类加载过程

    除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射) 2.2 类加载器ClassLoader角色 class file...使用 BinaryViewer 查看字节码文件,其开头均为 CAFE BABE ,如果出现不合法的字节码文件,那么将会验证不通过 准备(Prepare) 为类变量分配内存并且设置该类变量的默认初始值,int...类型即零值,引用则为null 这里不包含用final修饰的static,因为final在编译的时候就会分配好了默认值,准备阶段会显式初始化 注意:这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到...也就是说,当我们代码中包含static变量的时候,就会有( )方法;如果当前类不存在static变量,那么它的字节码文件是不会存在 ( ) ()方法中的指令按语句在源文件中出现的顺序执行...() 方法在多线程下被同步加锁 当我们代码中包含static变量的时候,就会有clinit方法 如果当前类不存在static变量,那么它的字节码文件是不会存在( )

    29420

    2020最全Java面试题--基础篇

    JVM分配哪些不同类型的内存区域? 在Java中,JVM将内存分配给不同的进程,方法和对象。...10.在Java中,如果我们不为局部变量指定任何值,那么局部变量的默认值是什么? Java不会使用任何默认值初始化局部变量。 因此,这些变量默认情况下将为null。...基于对象的编程语言提供对对象的支持,您可以从构造函数中构建对象。 他们的语言还支持封装。 这些也称为面向原型的语言。 3. 在Java中,定义为对象中的实例变量的对象引用的默认值是什么?...Java中的默认构造器返回的值是什么? 当我们用Java调用构造函数时,它返回由它创建的对象。 这就是我们用Java创建新对象的方式。 7. 我们能继承构造函数吗?...8.如果Java中没有指针,那为什么我们会得到NullPointerException? 在Java中,指针是等同于对象引用。 当我们使用。 它指向对象的引用。

    58331

    java的局部变量和全局变量_java全局变量和局部变量

    而下面部分代码则是方法中的变量,也就是局部变量。我们直接打印它或者用到它的时候直接会报错。   如何解释这一现象?局部变量必须赋初始值?下面我们多方面分析一下。  ...成员变量作为类的数据是会随着类的加载在堆中分配内存,注意了,JVM 在申请内存时自动给它们赋了初值。这里附上下面一个堆栈简单示意图,   至于默认给类的成员变量赋初值有什么机理吗?...我们还可以换个角度来想这个问题,假如你是开发 Java 这门伟大语言的开发者,你在设计的时候,类的成员变量是要在堆中分配内存的,方法中的局部变量是在栈中的。...同时在一般情况下成员变量也不会有初始值,你可以联想一下,有一个class 比如说是人类,里面的身高体重如果定义时候给了初始值,是不是觉得一点都不抽象了,所以成员变量不初始化可能更符合需求,创建类的对象的时候它们也会有初始值...(ps: static 修饰的成员变量不用创建对象也可以哦)   最后套用《Thinking in Java》作者的话: 编译器当然可以为局部变量附一个默认值,但是未初始化的局部变量更有可能是程序员的疏忽

    1.7K20
    领券