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

在java中,匿名类会占用PermGeneration还是MetaGeneration?

在Java中,匿名类不会占用PermGeneration或MetaGeneration。在Java 8之前的版本中,PermGeneration是用于存储类的元数据和常量池等信息的区域,而MetaGeneration是Java 8中引入的用于存储类的元数据的区域。然而,匿名类的定义是在堆中进行的,而不是在PermGeneration或MetaGeneration中。匿名类的定义会在运行时动态地生成,并且会被加载到堆中的新对象中。因此,匿名类不会占用PermGeneration或MetaGeneration。

需要注意的是,Java 8之后的版本已经移除了PermGeneration,取而代之的是MetaSpace。MetaSpace是在堆外分配的内存空间,用于存储类的元数据信息。同样地,匿名类的定义也不会占用MetaSpace。

总结起来,无论是在Java 8之前的版本还是Java 8之后的版本,匿名类的定义都不会占用PermGeneration、MetaGeneration或MetaSpace。匿名类的定义是在堆中进行的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JVM参数详解及OOM

-XX:PermSize: 指定JVMPermGeneration的最小值,如:-XX:PermSize=32m,Java8此参数被忽略,永久代由元空间代替。...-XX:MaxPermSize: 指定JVMPermGeneration的最大值,如:-XX:MaxPermSize=64m,Java8此参数被忽略,永久代由元空间代替。...经常动态生成大量Class的应用,需要特别注意的回收状况。...这类场景除了上面提到的程序使用了CGLib字节码增强和动态语言之外,常见的还有:大量JSP或动态产生JSP文件的应用(JSP第一次运行时需要编译为Java)、基于OSGi的应用(即使是同一个文件,被不同的加载器加载也视为不同的...Java8,由于绝大多数的元数据的空间都从本地内存中分配,所以你再也看不到java.lang.OutOfMemoryError: PermGen error的异常了。

3.4K60

深入探索Java 8 Lambda表达式

到这里,你可能会对Java编译器和JVM内部如何处理Lambda表达式和方法引用比较好奇。可能提出这样的问题,Lambda表达式会不会就是匿名内部类的语法糖呢?...假设Lambda表达式翻译成匿名内部类,那么每一个Lambda表达式都会有一个对应的文件。随着匿名内部类进行加载,其必然要占用JVM的元空间(从Java 8开始永久代的一种替代实现)。...如果匿名内部类的方法被JIT编译成机器代码,则会存储到代码缓存。同时,匿名内部类都需要实例化成独立的对象。以上关于匿名内部类的种种会使得应用的内存占用增加。...实践的性能分析 理解了Lambda的性能模型很是重要,但是实际应用的总体性能如何呢?我们使用Java 8 编写了一些软件项目,一般都取得了很好的效果。...Scala曾经通过生成匿名内部类的形式支持Lambda表达式。Scala 2.12版本,Lambda的实现形式替换为Java 8的Lambda 工厂机制。

74731

Android(Java) | 你真的熟悉Java匿名内部类吗(Java匿名内部类的限制)

如上代码, new Foo()定义的时候, 重写了bar()这个方法, 如此一来new Foo(){...}这里就是一个匿名内部类了; 呐这个匿名内部类,实际上字节码定义出来的,!!!...但是下面这种类型, 既 继承某个父 又 实现某个接口 的“匿名内部类” 的 这种类型, Java是不被接受的, 因为这其实是一种“或类型”, 即Runnable或上Foo的结果,作为一种...**即使使用Java 10 的var关键字来定义, 只能继承一个父或实现一个接口 >- 父是非静态的类型,则需父外部实例来初始化 >- 如果定义非静态作用域内,引用外部类实例 >-...如上代码, new Foo()定义的时候, 重写了bar()这个方法, 如此一来new Foo(){...}这里就是一个匿名内部类了; 呐这个匿名内部类,实际上字节码定义出来的,!!...即使使用Java 10 的var关键字来定义, 也是不行的, 这种类型还是不能被接受: (处理 var时,编译器先是查看表达式右边部分, 也就是所谓的构造器,并将它作为变量的类型,然后将该类型写入字节码当中

1.8K60

Java8——行为参数化传递代码

简单的解决办法就是重复写一个方法,再改条件为红苹果,但是,要筛选的颜色有多种的情况,这样写导致代码十分冗余,所以我们第一步尝试将其抽象化。...,导致后面如果有很多策略,增加很多的,我们知道使用匿名也是一种不错的选择 6、第五次尝试:使用匿名 List redApples = filterApples(inventory...Apple apple){ return "red".equals(apple.getColor()); } }); 但是问题又来了,匿名还是不够好...,第一,它往往很笨重,占用了很多的空间,第二,使用起来让人费解,导致代码可读性不高,即使匿名处理某种程度上改善了为一个接口声明好几个实体的啰嗦问题,但是还是不能令人满意,自java8引入的lambda...传递代码,就是将新行为作为参数传递给方法,但是java8之前实现起来很啰嗦。为接口声明许多只用一次的实体而造成的啰嗦代码,java8之前可以用匿名来减少。

49630

深入探索Java 8 Lambda表达式

到这里,你可能会对Java编译器和JVM内部如何处理Lambda表达式和方法引用比较好奇。可能提出这样的问题,Lambda表达式会不会就是匿名内部类的语法糖呢?...随着匿名内部类进行加载,其必然要占用JVM的元空间(从Java 8开始永久代的一种替代实现)。如果匿名内部类的方法被JIT编译成机器代码,则会存储到代码缓存。...AnonymousClassExample1这个文件,你会发现这个就是Function接口的实现。  将Lambda表达式翻译成匿名内部类限制以后可能进行的优化(比如缓存)。...实践的性能分析  理解了Lambda的性能模型很是重要,但是实际应用的总体性能如何呢?我们使用Java 8 编写了一些软件项目,一般都取得了很好的效果。...Scala曾经通过生成匿名内部类的形式支持Lambda表达式。Scala 2.12版本,Lambda的实现形式替换为Java 8的Lambda 工厂机制。

39620

Java8实战——通过行为参数化传递代码 顶

简单的解决办法就是重复写一个方法,再改条件为红苹果,但是,要筛选的颜色有多种的情况,这样写导致代码十分冗余,所以我们第一步尝试将其抽象化。...,导致后面如果有很多策略,增加很多的,我们知道使用匿名也是一种不错的选择 6、第五次尝试:使用匿名 List redApples = filterApples(inventory...apple){ return "red".equals(apple.getColor()); } }); 但是问题又来了,匿名还是不够好...,第一,它往往很笨重,占用了很多的空间,第二,使用起来让人费解,导致代码可读性不高,即使匿名处理某种程度上改善了为一个接口声明好几个实体的啰嗦问题,但是还是不能令人满意,自java8引入的lambda...传递代码,就是将新行为作为参数传递给方法,但是java8之前实现起来很啰嗦。为接口声明许多只用一次的实体而造成的啰嗦代码,java8之前可以用匿名来减少。

57230

Java避坑指南:不要使用双括号初始化技巧,非静态匿名内部类可能导致内存泄露,发生OOM

---- 双括号初始化,第一个括号的含义是生成一个匿名,第二个括号的含义是初始化块。...反编译第一个Demo$2: Demo$2继承了java.util.HashMap。...非静态匿名内部类坑:内存泄露,发生OOM ---- 上面反编译得知,双括号初始化技巧(double-brace initialization trick)导致JVM运行时生成、加载并且初始化。...如过运行时大量生成导致占用大量JVM内存,甚至OOM的发生,尤其是非静态匿名内部类,这个Android开发中经常碰到。...,大量的匿名内部类一瞬间生成会对JVM垃圾回收造成影响,可能导致OOM的发生; 非静态匿名内部类的生成,导致此类隐式强引用外部类,如果两个的实例的生命周期不一致,也导致外部类无法被回收,从而造成了内存泄露

46420

如何设计一个图片加载框架

因此当Activity被结束后,这个msg在被取出来之前,这msg继续存活,但是这个msg持有handler的引用,而handlerActivity创建,持有Activity的引用,因而当Activity...因为java中所有非静态的对象都会持有当前的强引用,而静态对象则只会持有当前的弱引用。...2.通过JNI创建java层Bitmap对象,这个对象java堆中分配内存。 像素数据是存在native层Bitmap,也就是证明8.0的Bitmap像素数据存在native堆。...Bitmap构造方法创建了一个 BitmapFinalizer,重写finalize 方法,java层Bitmap被回收的时候,BitmapFinalizer 对象也会被回收,finalize 方法肯定会被调用...4.4以下,Fresco 使用匿名共享内存来保存Bitmap数据,首先将图片数据拷贝到匿名共享内存,然后使用Fresco自己写的加载Bitmap的方法。

47630

Java】创建多线程的四种方式

创建Thread匿名子类的匿名对象 // 创建Thread匿名子类的匿名对象,并启动线程 new Thread(){ public void run(){ // 执行的操作 } }.strat...Thread的构造器,创建Thread的实例 通过Thread的实例对象调用strat()方法,启动线程 ----> Java虚拟机会调用run()方法 最终还是通过Thread实现的 1....Runnable好处: 通过实现的方式,避免了的单继承的局限性 自动共享数据,更适合处理有共享数据的业务逻辑 实现了逻辑代码(run()方法)和数据(创建线程的方法)的分离 四、Thread常用方法和生命周期...锁无法修改,因而在继承Thread方法不适用,可以改成同步代码块方式,手动添加将当前做为锁 * 2.static的方法,默认的锁是:当前.class。即当前本身。...针对条件3:占用部分资源的线程进一步申请其他资源时,如果申请不到(一定时间内),就主动释放掉已经占用的资源。 针对条件4:可以将资源改为线性顺序(优先级)。

1.3K20

Java 内部类

2、 认识内部类 内部类,顾名思义,就是一个定义已有的Java内部的,就像下面这样: public class Outer { //外部类 class Inner{ //内部类...下面分别介绍——   普通内部类  普通情况,或者说最典型的情况,就是一个Java另一个Java,形成了内、外的格局;外部类就是我们普通的,内部类也是普通的,特性都满足Java的特性,...从这个方面去想,Java的设计者通过对于代码的编写的优化是比我等菜鸟要高深那么一点点点点。。。。    匿名内部类   继续顾名思义,匿名内部类,就是没有名的内部类。...所以你该知道,匿名内部类本质上就是一种代码上的减省,实际上它还是遵循着Java实现(继承)后再创建对象的语法逻辑的,不信看下面的代码: public class Model { private...通过匿名内部类的方式返回Model对象的时候是有继承体系的,也即匿名实体是继承了Model的,不然实体的无法使用super调用父方法;② 不只是接口的实现可以用匿名内部类,普通的继承也是可以的

66530

Android性能优化之内存泄漏,你想要的这里都有~

前言 Android,内存泄露的现象十分常见;而内存泄露导致的后果会使得应用Crash 本文 全面介绍了内存泄露的本质、原因 & 解决方案,最终提供一些常见的内存泄露分析工具,希望你们喜欢。...常见的内存泄露原因 & 解决方案 常见引发内存泄露原因主要有: 集合 Static关键字修饰的成员变量 非静态内部类 / 匿名 资源对象使用后未关闭 下面,我将详细介绍每个引发内存泄露的原因 5.1...启动频繁的Activity,为了避免重复创建相同的数据资源,会在Activity内部创建一个非静态内部类的单例 b....储备知识 多线程的使用方法 = 非静态内部类 / 匿名;即 线程 属于 非静态内部类 / 匿名 泄露原因 当 工作线程正在处理任务 & 外部类需销毁时, 由于 工作线程实例 持有外部类引用,将使得外部类无法被垃圾回收器...Heap 内存分析工具 ->>下载地址 作用:查看当前内存占用情况 通过分析 Java 进程的内存快照 HPROF 分析,快速计算出在内存对象占用的大小,查看哪些对象不能被垃圾收集器回收 & 可通过视图直观地查看可能造成这种结果的对象

75830

Android性能优化:手把手带你全面了解 内存泄露 & 解决方案

前言 Android,内存泄露的现象十分常见;而内存泄露导致的后果会使得应用Crash 本文 全面介绍了内存泄露的本质、原因 & 解决方案,最终提供一些常见的内存泄露分析工具,希望你们喜欢。...常见的内存泄露原因 & 解决方案 常见引发内存泄露原因主要有: 集合 Static关键字修饰的成员变量 非静态内部类 / 匿名 资源对象使用后未关闭 下面,我将详细介绍每个引发内存泄露的原因 5.1...启动频繁的Activity,为了避免重复创建相同的数据资源,会在Activity内部创建一个非静态内部类的单例 b....储备知识 多线程的使用方法 = 非静态内部类 / 匿名;即 线程 属于 非静态内部类 / 匿名 泄露原因 当 工作线程正在处理任务 & 外部类需销毁时, 由于 工作线程实例 持有外部类引用,将使得外部类无法被垃圾回收器...Heap 内存分析工具 ->>下载地址 作用:查看当前内存占用情况 通过分析 Java 进程的内存快照 HPROF 分析,快速计算出在内存对象占用的大小,查看哪些对象不能被垃圾收集器回收 & 可通过视图直观地查看可能造成这种结果的对象

90531

Java 学习笔记(8)——匿名对象与内部类

一般在编写代码时可能遇到这样的场景——某些时候,我需要定义并某个,但是只会使用这一次,或者是某个对象只会使用一次,为它们专门取名可能显的很麻烦。...为了应对这种情况,Java中允许使用匿名对象和匿名内部类的方式来解决这个矛盾 匿名对象 普通的对象使用时会定义一个类型的变量,用来保存new出来的所在的地址。...而匿名取消掉了这个变量,这个地址由编译器来处理,并且new出来之后,它占用的内存会有JVM自动回收掉。后续无法再使用了。...内部类 内部类的种类:成员内部类、静态内部类、局部内部类、匿名内部类 成员内部类 java中允许一个定义另一个。...,也可以定义方法,作为局部内部类 局部内部类也叫区域内嵌,局部内部类与成员内部类类似,不过,区域内嵌是定义一个方法的内嵌 主要特定有: 局部内部类只能在对应方法访问,方法外无效 不能使用

44230

Android高频面试专题 - 进阶篇(二)内存泄漏

(PS:线程执行过程并不都是一口气执行完,有可能在一个CPU时钟周期内没有执行完,由于时间片用完了,所以不得不暂停执行,当下一次获得CPU资源时,通过程序计数器就知道该从什么地方开始执行) 方法区:方法区存放的信息...(包括的字节码,的结构)、常量、静态变量等。...字符串常量池就是方法区。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的是与Java堆区分开来。...finalize方法至多由GC执行一次,即使finalize()方法复活对象,第二次GC如果对象仍不可达,那么还是会被回收。...匿名内部类/非静态内部类和异步线程 Java,非静态内部类和匿名内部类默认持有外部类的引用,比较容易引起内存泄漏的有Handler, AsyncTask使用匿名内部类形式。

70620

从JIT到加载再到实现原理解式Lambda编译慢的问题

JIT 即时编译 首先介绍一下什么是JIT即时编译: 当 JVM 的初始化完成后,调用执行过程,执行引擎会把字节码转为机器码,然后操作系统才能执行。...,当循环达到回边计数器阈值时,JVM 认为这段是热点代码,JIT 编译器就会将这段代码编译成机器语言并缓存,该循环时间段内,直接将执行代码替换,执行缓存的机器语言 从上述的概念,我们应该可以得到一个结论...Lambda,JVM额外加载 LambdaMetafactory,且耗时较长 第二次调用Lambda方法时,JVM就不再需要额外加载 LambdaMetafactory,因此执行较快 完美印证了之前提出的问题...匿名内部类有一定的缺陷: 编译器为每个匿名内部类生成一个新的文件,生成许多文件是不可取的,因为每个文件使用之前都需要加载和验证,这会影响应用程序的启动性能,加载可能是一个昂贵的操作,包括磁盘I/...由于每个匿名内部类都将被加载,它将占用JVM的元空间,如果JVM将每个此类匿名内部类的代码编译为机器码,那么它将存储代码缓存。 此外,这些匿名内部类将被实例化为单独的对象。

87130

记一场 Android 技术答疑

MessageQueue通常为Looper持有 Looper和可以认为和线程生命周期相同 通常情况下,我们使用匿名内部类的形式创建Handler,而匿名内部类(非静态内部类)隐式持有外部类的引用。...无论是Handler还是Timer都需要依赖于进程存活 利用Handler实现定时任务的:HandlerTimer 如果时间较长,则需要使用AlarmManager 另外,我们对于这种业务应该优先考虑是否可以基于事件通知...合理进行缩放,一个高分辨率的图片不仅展示一个小的imageView,不仅不会有任何视觉优势,反而还占用了很大的内存 将Bitmap处理移除主线程 使用LruCache或者DiskLruCache缓存...第三方的库不建议混淆 一些需要排除混淆的 被native方法调用的java方法 供javascript调用的java方法 反射调用的方法 AndroidManifest声明的组件 总结:即所有硬编码的元素...(变量,方法,) 关于混淆,请参考文章读懂 Android 的代码混淆

51820

从JIT到加载再到实现原理

JIT 即时编译 首先介绍一下什么是JIT即时编译: 当 JVM 的初始化完成后,调用执行过程,执行引擎会把字节码转为机器码,然后操作系统才能执行。...,当循环达到回边计数器阈值时,JVM 认为这段是热点代码,JIT 编译器就会将这段代码编译成机器语言并缓存,该循环时间段内,直接将执行代码替换,执行缓存的机器语言 从上述的概念,我们应该可以得到一个结论...Lambda,JVM额外加载 LambdaMetafactory,且耗时较长 第二次调用Lambda方法时,JVM就不再需要额外加载 LambdaMetafactory,因此执行较快 完美印证了之前提出的问题...匿名内部类有一定的缺陷: 编译器为每个匿名内部类生成一个新的文件,生成许多文件是不可取的,因为每个文件使用之前都需要加载和验证,这会影响应用程序的启动性能,加载可能是一个昂贵的操作,包括磁盘I/...由于每个匿名内部类都将被加载,它将占用JVM的元空间,如果JVM将每个此类匿名内部类的代码编译为机器码,那么它将存储代码缓存。 此外,这些匿名内部类将被实例化为单独的对象。

1.1K40

android内存优化

刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成。...Java基于垃圾回收的内存机制 Java的内存管理机制自动回收无用对象所占用的内存,减轻手工管理内存的负担       1、C/C++: 从申请、使用、释放都需要手工管理       2、Java:无用的对象的内存会被自动回收...Java程序的内存泄漏 对象的内存在分配之后无法通过程序的执行逻辑释放对该对象的引用,不能被回收该对象所占内存 内存泄漏的危害 1、  引起OutOfMemoryError 2、  内存占用高时JVM...Heap dump •       包含了触发Heap dump生成的时刻Java进程的内存快照,主要内容为各个Java和对象堆内存的分配情况 Memory Analyzer Tool (MAT)...当使用内部类(包括匿名)来创建Handler的时候,Handler对象隐式地持有一个外部类对象(通常是一个Activity)的引用,因为View依附着一个Activity。

1.3K90

java8 函数式编程一

二、Lambda 表达式 1、Lambda 表达式和匿名内部类 先来复习一下匿名内部类的知识: 如果是接口,相当于在内部返回了一个接口的实现,并且实现方式是的内部进行的; 如果是普通匿名相当于继承了父...() 是参数列表, 和上面匿名内部类示例的是一样的。 -> 将参数和 Lambda 表达式的主体分开, 而主体是之后操作运行的一些代码。...2、Lambda 表达式和集合 java8 java.util 包引入了一个新的 —— Stream.java。...Java8 虽然匿名内部类可以引用非 final 变量, 但是该变量既成事实上必须是final。即如果你试图给该变量多次赋值, 然后 Lambda 表达式引用它, 编译器就会报错。...Stream 是用函数式编程方式集合上进行复杂操作的工具。 对于需要大量数值运算的算法来说, 装箱和拆箱的计算开销, 以及装箱类型占用的额外内存, 明显减缓程序的运行速度。

93230

Android 关于内存泄露,你必须了解的东西

二、Android 内存泄露的常见场景 & 解决方案 ---- 1、单例造成的内存泄露 单例模式是非常常用的设计模式,使用单例模式的,只会产生一个对象,这个对象看起来像是一直占用着内存,但这并不意味着就是浪费了内存...但是过多的单例会让内存占用过多,而且单例模式由于其 静态特性,其生命周期 = 应用程序的生命周期,不正确地使用单例模式也造成内存泄露。...这里再拓展一点,很多时候我们需要用到 Activity 或者 Context 的地方,直接将 Activity 的实例作为参数传给对应的,就像这样: public class Sample {...Activity 中继承 AsyncTask 自定义了一个非静态内部类, doInbackground() 方法做了耗时的操作,然后 onCreate() 启动 MyAsyncTask。...匿名和非静态内部类最大的共同点就是 都持有外部类的引用,因此,匿名造成内存泄露的原因也跟静态内部类基本是一样的,下面举个几个比较常见的例子: public class MainActivity extends

1.1K10
领券