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

Android经典面试题笔记之JVM内存管理剖析

时间片轮转、多线程,需要记录 虚拟机栈 组成:栈帧--> 局部变量表,操作数栈、动态连接、完成出口(返回地址) 局部变量表:存储8大基本数据类型和引用 操作数栈:存放方法的执行和操作 动态连接:涉及多态...栈帧的方法执行,局部变量的引用进入栈帧的局部变量表 HSDB 工具 查看JVM内存 深入辨析堆和栈 功能 以栈帧的方式存储方法调用的过程,并存储方法调用过程中的基本数据类型的变量(int、short、...long、byte、float、double、boolean、char)和对象的引用变量,其内存分配咋栈上,变量出了作用域就会释放 堆内存用来存储Java中的对象,无论是成员变量,局部变量,还是类变量,...方法) 虚拟机优化技术 编译优化 --> 方法内联,就是运行的时候判断方法是不是直接的表达式,可以提取出来,这样就减少入栈出栈操作 栈的优化技术 -->栈帧之间数据共享,方法相互调用时有传参数,也就是操作数栈和另一个栈帧的局部变量表之间的共享...时,JVM 命令将会调用 String 的构造函数,同时引用常量池中的"abc” 字符串, // 在堆内存中创建一个 String 对象;最后,str1 将引用 String 对象。

10610

Java基础知识点总结

(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收) 值传递和引用传递的区别 值传递(pass by value)指的是在把实参传递给形参的时候,将实际的参数复制一份传递给函数的形参,也就是说...引用传递(pass by reference)指的是在实际的函数调用时,将实际参数的地址传递给函数的形式参数,也就是说其实形参和实参保存的是堆中同一个对象的地址。...传参是值传递还是引用传递 基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的 对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。...原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。...它有一个缺点不能解决循环引用的问题; 可达性分析算法:从 GC Roots作为起点,引用链作为路径。当一个对象到 GC Roots没有任何引用链相连时,则证明此对象是可以被回收的。

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

    聊聊对JVM内存结构的理解吧

    局部变量表定义为一个数字数组,主要用于存储方法参数、定义在方法体内部的局部变量,数据类型包括各类基本数据类型,对象引用,以及 return address 类型。...对象分配过程new 的对象先放在 Eden 区,大小有限制如果创建新对象时,Eden 空间填满了,就会触发 Minor GC,将 Eden 不再被其他对象引用的对象进行销毁,再加载新的对象放到 Eden.../元空间搜集Full GC /Major GC 触发条件显示调用System.gc(),老年代的空间不够,方法区的空间不够等都会触发 Full GC,同时对新生代和老年代回收,FUll GC 的 STW...而在 JAVA 中对象就是可以被进一步分解的聚合量替换过程,通过逃逸分析确定该对象不会被外部访问,并且对象可以被进一步分解时,JVM 不会创建该对象,而会将该对象成员变量分解若干个被这个方法使用的成员变量所代替...当一个对象在方法中被定义后,它可能被外部方法所引用,如作为调用参数传递到其他地方中,称为方法逃逸。

    34130

    JVM 内存结构

    局部变量表定义为一个数字数组,主要用于存储方法参数、定义在方法体内部的局部变量,数据类型包括各类基本数据类型,对象引用,以及 return address 类型。...对象分配过程new 的对象先放在 Eden 区,大小有限制如果创建新对象时,Eden 空间填满了,就会触发 Minor GC,将 Eden 不再被其他对象引用的对象进行销毁,再加载新的对象放到 Eden.../元空间搜集Full GC /Major GC 触发条件显示调用System.gc(),老年代的空间不够,方法区的空间不够等都会触发 Full GC,同时对新生代和老年代回收,FUll GC 的 STW...而在 JAVA 中对象就是可以被进一步分解的聚合量替换过程,通过逃逸分析确定该对象不会被外部访问,并且对象可以被进一步分解时,JVM 不会创建该对象,而会将该对象成员变量分解若干个被这个方法使用的成员变量所代替...当一个对象在方法中被定义后,它可能被外部方法所引用,如作为调用参数传递到其他地方中,称为方法逃逸。

    16830

    一文详解JVM内存结构

    局部变量表 定义为一个数字数组,主要用于存储方法参数、定义在方法体内部的局部变量,数据类型包括各类基本数据类型,对象引用,以及 return address 类型。...对象分配过程 new 的对象先放在 Eden 区,大小有限制 如果创建新对象时,Eden 空间填满了,就会触发 Minor GC,将 Eden 不再被其他对象引用的对象进行销毁,再加载新的对象放到 Eden...而在 JAVA 中对象就是可以被进一步分解的聚合量 替换过程,通过逃逸分析确定该对象不会被外部访问,并且对象可以被进一步分解时,JVM 不会创建该对象,而会将该对象成员变量分解若干个被这个方法使用的成员变量所代替...当一个对象在方法中被定义后,它可能被外部方法所引用,如作为调用参数传递到其他地方中,称为方法逃逸。...有引用变量指向时永远不会被垃圾回收,jvm 即使抛出 OOM,可以将引用赋值为 null,那么它所指向的对象就会被垃圾回收。

    22020

    运行时数据区 Krains 2020-08-01

    ) 方法返回地址(Return Address)(或方法正常退出或者异常退出的定义) 一些附加信息 # 局部变量表 定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量这些数据类型包括各类基本数据类型...局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收。 # 操作数栈 操作数栈,主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。...# 动态链接(指向运行时常量池的方法引用) 动态链接指向运行时常量池中该栈帧所属方法的引用,在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(symbolic Reference...比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。 ? 为什么需要运行时常量池?...新对象申请时,如果Eden放得下,就放到Eden区,放不下就触发YoungGC,将Eden区和From区有GCRoot引用的对象复制到To区,如果清理之后还能够放下就放到Eden区,如果放不下就放Old

    35730

    jvm运行时数据区表示

    String的字符串常量表 ;SymbolTable用来保存定位和重新定位符号定义和符号引用所需要的信息 运行时常量池 表示类文件中每个类或者每个接口运行时的表示,它包括编译时已知的数字常量到必须在运行时解析的方法和字段引用...一个新的帧会在方法执行的时候创建,并在方法执行完毕的时候销毁。每个帧都会包含自己的局部变量,操作数栈和类当前运行方法对运行时常量池的引用。在编译的时候,局部变量和操作数栈的大小就定下来了。...任何时候,给定一个线程只有一个帧是Active,它又被称作当前帧 线程自己创建的帧是不能和其它线程共享的 局部变量 局部变量通过下标索引的方式访问。...第一个局部变量的索引是0,方法执行过程中的传参也是使用局部变量来实现的,他们从0开始一直按照递增的方式连续的增长下标表示不同的参数。...然后由其它的指令取出并操作,然后把结果放回到栈中 传递给下一个方法的参数和接收方法的返回值也都是放在这里 操作数栈中的每一个值的类型和操作方法一定是匹配上的,这种关系在class文件上会做验证。

    41820

    Java 函数调用是传值还是传引用?从字节码角度来看看 !

    如果修改传参的指向地址,调用传参的set方法,无法对原本参数的值进行修改。 综上所述,基本类型的传参,在方法内部是值拷贝,有一个新的局部变量得到这个值,对这个局部变量的修改不影响原来的参数。...对象类型的传参,传递的是堆上的地址,在方法内部是有一个新的局部变量得到引用地址的拷贝,对该局部变量的操作,影响的是同一块地址,因此原本的参数也会受影响,反之,若修改局部变量的引用地址,则不会对原本的参数产生任何可能的影响...第2个是局部变量age。在字节码第8行,通过bipush 18,将常量18直接压入操作栈,然后第20行,是调用了process的function3方法,传入了age作为参数。...1.main函数栈帧和上文测试基本类型传参时的字节码大致类似,不同的是局部变量处。局部变量2处保存的是main函数中新建的Car实例的堆上地址。...在执行至9:astore_2时,栈中新创建的Car实例的引用地址出栈,保存在局部变量2处。局部变量1保存的是传参进来的Car实例的引用地址。

    1.5K30

    姆级教程,2万字详解JVM

    ,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个OutOfMemoryError异常 可以通过参数-Xss来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度...在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 Class 文件的常量池中。...new 的对象先放在伊甸园区,此区有大小限制 当伊甸园的空间填满时,程序又需要创建对象,JVM 的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁...例如作为调用参数传递到其他地方中,称为方法逃逸。...常见栈上分配的场景:成员变量赋值、方法返回值、实例引用传递 代码优化之同步省略(消除) 线程同步的代价是相当高的,同步的后果是降低并发性和性能 在动态编译同步块的时候,JIT 编译器可以借助逃逸分析来判断同步块所使用的锁对象是否能够被一个线程访问而没有被发布到其他线程

    63640

    深入理解ThreadLocal

    对于一些线程级别,传递方法参数有许多层的时候,我们可以使用ThreadLocal包装,只在特定地方set一次,然后不管在什么地方都可以随便get出来,从而巧妙了避免了多层传参。...在线程消失之后,它的所有线程本地实例副本都将进入垃圾收集(除非存在对这些副本的其他引用)。 例如,如果您的服务在servlet容器中执行,那么当请求完成时,它的线程将返回到池中。...如果您还没有清理线程的ThreadLocal变量内容,那么在线程处理下一个请求时该数据将继续存在。每个线程都是GC根节点,附加到线程的线程本地变量在线程结束后才会被垃圾回收。...-147214397.png ThreadLocalMap使用ThreadLocal的弱引用作为key,如果一个ThreadLocal没有外部强引用来引用它,那么系统 GC 的时候,这个ThreadLocal...假设您正在ka在webapp处理HTTP请求时创建/使用的线程局部变量,避免线程本地泄漏的一种方法是在webapp的ServletContext中注册一个ServletRequestListener,并实现该侦听器的

    99630

    2万字长文包教包会 JVM 内存结构 保姆级学习笔记

    ,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个OutOfMemoryError异常 可以通过参数-Xss来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度...在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 Class 文件的常量池中。...new 的对象先放在伊甸园区,此区有大小限制 当伊甸园的空间填满时,程序又需要创建对象,JVM 的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁...例如作为调用参数传递到其他地方中,称为方法逃逸。...常见栈上分配的场景:成员变量赋值、方法返回值、实例引用传递 代码优化之同步省略(消除) 线程同步的代价是相当高的,同步的后果是降低并发性和性能 在动态编译同步块的时候,JIT 编译器可以借助逃逸分析来判断同步块所使用的锁对象是否能够被一个线程访问而没有被发布到其他线程

    49541

    2万字长文包教包会 JVM 内存结构

    ,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个OutOfMemoryError异常 可以通过参数-Xss来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度...在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 Class 文件的常量池中。...比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用 ?...new 的对象先放在伊甸园区,此区有大小限制 当伊甸园的空间填满时,程序又需要创建对象,JVM 的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁...常见栈上分配的场景:成员变量赋值、方法返回值、实例引用传递 代码优化之同步省略(消除) 线程同步的代价是相当高的,同步的后果是降低并发性和性能 在动态编译同步块的时候,JIT 编译器可以借助逃逸分析来判断同步块所使用的锁对象是否能够被一个线程访问而没有被发布到其他线程

    50040

    保姆级教程,2万字详解JVM

    ,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个OutOfMemoryError异常 可以通过参数-Xss来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度...在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 Class 文件的常量池中。...new 的对象先放在伊甸园区,此区有大小限制 当伊甸园的空间填满时,程序又需要创建对象,JVM 的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁...例如作为调用参数传递到其他地方中,称为方法逃逸。...常见栈上分配的场景:成员变量赋值、方法返回值、实例引用传递 代码优化之同步省略(消除) 线程同步的代价是相当高的,同步的后果是降低并发性和性能 在动态编译同步块的时候,JIT 编译器可以借助逃逸分析来判断同步块所使用的锁对象是否能够被一个线程访问而没有被发布到其他线程

    1.1K10

    【C++】This指针和复制构造函数

    复制构造函数一种特殊的构造函数,在创建一个新的对象时将其他对象作为参数时, 编译器将会调用复制构造函数。不提供时使用默认构造函数。默认构造函数内部各个成员变量赋值。...CTime(CTime& time);//使用类名对象作为参数,传引用 调用复制构造函数的时机: 在什么情况下使用复制构造函数 1.以其他对象作为参数创建新对象时。...比如:创建一个新的对象的时候,把原来的一个对象作为参数传递给新的对象作为构造函数 CTime time; CTime time2(time);//会自动执行复制构造函数,复制成员等 CTime::...2.类对象(传值)作为函数参数时。...,以类对象(传值)作为函数参数时, 这样在使用的时候,就会造成死循环!

    83920

    进阶课程1:jvm内存模型

    每个线程都不能访问 (看不见) 其他线程的局部变量。 所有原生类型的局部变量都存储在线程栈中,因此对其他线程是不可见的。 线程可以将一个原生变量值的副本传给另一个线程,但不能共享原生局部变量本身。...当该对象被引用时,该成员变量的值会被加载到栈上,以供方法使用。当该方法执行完毕时,该值会被存回堆中,以供其他方法或线程使用。...如果一个线程可以访问某个对象时也就可以访问该对象的成员变量。如果两个线程同时调用某个对象的同一方法,则它们都可以访问到这个对象的成员变量,但每个线程的局部变量副本是独立的。...在JVM中,每个方法被调用时,都会创建一个新的栈帧(stack frame)来保存方法的参数和局部变量。局部变量表是栈帧中的一部分,用于存储方法中定义的局部变量。...局部变量表中可以存储各种类型的变量,包括基本类型(如int、float等)和对象引用。局部变量表还可以存储方法的参数和临时变量,但是不包括实例变量和静态变量,它们存储在对象的实例数据和类数据中。

    21100

    J2EE复习

    ,比如每次将对象赋值给新的引用,或者对象的引用超出了作用域等。...线程局部变量: 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享.Java 提供ThreadLocal类来支持线程局部变量,是一种实现县城安全的方式.但是在管理环境下(如Web...服务器)使用 线程局部变量的时候要小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期药厂.任何线程局部变量一旦 在工作完成后没有释放,Java应用就存在内存泄漏的风险....Callable接口 接口,抽象类,类,引用区别 语法层面上抽象类和接口的区别: 1.抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract方法; 2.抽象类中的成员变量可以是各种类型的...Spring中Bean的作用域有singleton和prototype,singleton表示Bean以单例的方式存在;prototype表示每次 从容器中调用Bean时,都会返回一个新的实例。

    78920

    android内存优化

    1、  Class:由系统的类加载器加载的类对象 2、  Static Fields 3、  Thread:活着的线程 4、  Stack Local: java方法的局部变量或参数 5、  JNI Local...2、View持有其创建所在Context对象的引用,如果将View对象传递给其它生存周期比View所在Context更长的强引用,就可能会引起内存泄漏。...2、检查有没有把View传出到View所在Context之外的地方,如果有的话就需要检查生命周期。       3、工具类中最好不要有Context成员变量,尽量在调用函数时直接通过调用参数传入。...4、View持有其创建所在Context对象的引用,如果将View对象传递给其它生存周期比View所在Context更长的强引用,就可能会引起内存泄漏。       ...然而,如果用户在网络请求过程中关闭了Activity,正常情况下,Activity不再被使用,它就有可能在GC检查时被回收掉,但由于这时线程尚未执行完,而该线程持有Handler的引用(不然它怎么发消息给

    1.4K90

    面试必备笔记:深入理解 JVM

    、数组所需内存,由 GC 管理和回收 方法区:存储被 JVM 加载的类信息(字段、成员方法的字节码指令等)、运行时常量池(字面量、符号引用等)、JIT 编译后的 Code Cache 等信息;JDK8...引用计数算法(reference counting) 原理:每个对象都维护一个引用计数器rc,当通过赋值、传参等方式引用它时rc++,当引用变量修改指向、离开函数作用域等方式解除引用时rc--,递减到...: 执行上下文:JVM 栈中参数、局部变量、临时变量等引用的堆对象 全局引用:方法区中类的静态引用、常量引用(如 StringTable 中的字符串对象)所指向的对象 优点:无需对象维护 GC 元信息,...:将 region 按回收价值和时间成本筛选组成回收集,STW 将存活对象拷贝到空 regions 后清理旧 regions,完成回收 混合 GC 参数控制(文档:HotSpot GC Tuning...,当对象作为实参或调用方法时,需根据其静态类型或实际类型,才能确定要调用的方法的版本,进而确定其直接引用。

    49320

    面试必备笔记:深入理解 JVM

    ,用于分配对象、数组所需内存,由 GC 管理和回收 方法区:存储被 JVM 加载的类信息(字段、成员方法的字节码指令等)、运行时常量池(字面量、符号引用等)、JIT 编译后的 Code Cache 等信息...引用计数算法(reference counting) 原理:每个对象都维护一个引用计数器rc,当通过赋值、传参等方式引用它时rc++,当引用变量修改指向、离开函数作用域等方式解除引用时rc--,递减到...: 执行上下文:JVM 栈中参数、局部变量、临时变量等引用的堆对象 全局引用:方法区中类的静态引用、常量引用(如 StringTable 中的字符串对象)所指向的对象 优点:无需对象维护 GC 元信息,...:将 region 按回收价值和时间成本筛选组成回收集,STW 将存活对象拷贝到空 regions 后清理旧 regions,完成回收 混合 GC 参数控制(文档:HotSpot GC Tuning...,当对象作为实参或调用方法时,需根据其静态类型或实际类型,才能确定要调用的方法的版本,进而确定其直接引用。

    39021

    《深入理解 JVM 3ed》读书笔记

    ,用于分配对象、数组所需内存,由 GC 管理和回收 方法区 :存储被 JVM 加载的类信息(字段、成员方法的字节码指令等)、运行时常量池(字面量、符号引用等)、JIT 编译后的 Code Cache 等信息...引用计数算法(reference counting) 原理:每个对象都维护一个引用计数器rc,当通过赋值、传参等方式引用它时rc++,当引用变量修改指向、离开函数作用域等方式解除引用时rc--,递减到...: 执行上下文:JVM 栈中参数、局部变量、临时变量等引用的堆对象 全局引用:方法区中类的静态引用、常量引用(如 StringTable 中的字符串对象)所指向的对象 优点:无需对象维护 GC 元信息,...:枚举 GC Roots,已在新生代 GC 时顺带完成 并发标记:并发执行可达性分析,使用 SATB 记录引用变更 重新标记:SATB 分析,避免误回收 筛选回收:将 region 按回收价值和时间成本筛选组成回收集...空间分配担保 老年代作为 To Survivor 区的担保区域,当 Eden + From Survivor 中存活对象的总大小超出 To Survivor 时,将尝试存入老年代。

    34910
    领券