首页
学习
活动
专区
工具
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: 指定JVM中PermGeneration的最小值,如:-XX:PermSize=32m,在Java8中此参数被忽略,永久代由元空间代替。...-XX:MaxPermSize: 指定JVM中PermGeneration的最大值,如:-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 工厂机制。

76931
  • 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之前可以用匿名类来减少。

    50630

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

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

    58430

    深入探索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 工厂机制。

    41720

    Lambda表达式性能优化:JDK 17和JDK 21中Lambda如何提升性能与可读性?

    JDK 8中的Lambda实现:invokedynamic机制 在JDK 8中,Lambda表达式的实现基于invokedynamic指令: 编译时,Lambda表达式会生成调用invokedynamic...运行时,JVM会动态生成一个匿名类或方法句柄来执行Lambda逻辑。 这种方式的优点是灵活,但缺点是: 性能开销较高:需要动态生成类或方法句柄。 元空间占用多:频繁生成匿名类导致元空间膨胀。 2....JDK 17:Lambda表达式性能优化 JDK 17进一步优化了Lambda的实现机制,主要包括: 减少匿名类生成:避免过多元空间占用。 预生成方法句柄:提升Lambda表达式的执行性能。...8、JDK 17和JDK 21的性能优化流程: 说明: JDK 8使用invokedynamic机制,生成匿名类开销大。...未来趋势与总结 随着Java版本的不断升级,Lambda表达式的性能与可读性得到了持续优化。JDK 17减少了元空间的占用,JDK 21将Lambda与虚拟线程结合,彻底释放了Java的并发编程潜力。

    11310

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

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

    56320

    Java中的Lambda表达式与函数式接口详解

    4.2 事件监听中的Lambda表达式在GUI编程中,事件监听是常见的应用场景。Java 8之前,事件监听通常需要创建匿名类,这样会显得冗长且不易维护。...事实上,Lambda表达式的性能通常不会比传统的匿名类差,但它可能会影响一些特殊的性能敏感型应用程序。...通常情况下,Lambda表达式的性能不会比匿名类差,甚至在一些情况下,JVM的优化机制可能让Lambda表达式更加高效。...6.2 内存占用与GC性能Lambda表达式引入了内部类(一个包含方法的匿名类),这意味着它们的内存占用与匿名类类似。...对于Lambda表达式的实例,JVM可能会为其创建一个额外的类文件,从而增加一些内存占用。在长期运行的应用中,如果Lambda表达式被频繁创建且没有及时释放,可能会对GC性能产生一定影响。

    16901

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

    因此当Activity被结束后,这个msg在被取出来之前,这msg会继续存活,但是这个msg持有handler的引用,而handler在Activity中创建,会持有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的方法。

    50530

    【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.4K20

    Java 内部类

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

    67730

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

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

    84530

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

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

    1.4K31

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

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

    46530

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

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

    73620

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

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

    89630

    记一场 Android 技术答疑

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

    52720

    从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.4K90
    领券