热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JVM如何处理动态类

如何解决《JVM如何处理动态类》经验,为你挑选了1个好方法。

类定义存储在方法区域中,如Java虚拟机规范所述(Java®虚拟机规范Java SE 7版):

方法区域是在虚拟机启动时创建的.虽然方法区域在逻辑上是堆的一部分,但是简单的实现可能选择不垃圾收集或压缩它.

我们知道,像ASM,cglib,javassist,Hibernate和Spring框架这样的字节码工具正在使用它们.对于公共类文件,JVM加载并解析和初始化并最终使用它,我对JVM如何动态处理字节码工具生成的类感到困惑.我的问题是:

    如果JVM加载,则将动态类解析并初始化为公共类文件?

    它们也存储在方法区域中吗?

    JVM如何卸载和清理动态类定义以防止自身发生OutOfMemoryError?

Peter Lawrey.. 7

所有类都在运行时加载,可能编译为本机代码.因此,在程序启动后生成的类没有什么特别之处.

如果JVM加载,则将动态类解析并初始化为公共类文件?

它加载的方式与程序启动时存在的类相同.

它们也存储在方法区域中吗?

它们以相同的方式存储,实际上很难判断一个类是否是动态的.

JVM如何卸载和清理动态类定义以防止自身发生OutOfMemoryError?

JVM可以卸载它们所在的ClassLoader时卸载类.无论类是否动态,都是如此.

JVM如何知道以不同于"普通"类的方式处理动态类?

有一个特殊的动态类的例子.这些是在运行时生成的lambda类.使它们与众不同的是它们不受类加载器的约束,它们甚至没有正常的类名.当该类的所有实例都未使用时,它们将被卸载.

InnerClassLambdaMetafactory

UNSAFE.defineAnonymousClass(targetClass, classBytes, null);

该类没有附加类名(也不是ClassLoader)



1> Peter Lawrey..:

所有类都在运行时加载,可能编译为本机代码.因此,在程序启动后生成的类没有什么特别之处.

如果JVM加载,则将动态类解析并初始化为公共类文件?

它加载的方式与程序启动时存在的类相同.

它们也存储在方法区域中吗?

它们以相同的方式存储,实际上很难判断一个类是否是动态的.

JVM如何卸载和清理动态类定义以防止自身发生OutOfMemoryError?

JVM可以卸载它们所在的ClassLoader时卸载类.无论类是否动态,都是如此.

JVM如何知道以不同于"普通"类的方式处理动态类?

有一个特殊的动态类的例子.这些是在运行时生成的lambda类.使它们与众不同的是它们不受类加载器的约束,它们甚至没有正常的类名.当该类的所有实例都未使用时,它们将被卸载.

InnerClassLambdaMetafactory

UNSAFE.defineAnonymousClass(targetClass, classBytes, null);

该类没有附加类名(也不是ClassLoader)


"在Java 8中,元空间不会产生OutOfMemoryError"它不是吗?什么是`java.lang.OutOfMemoryError:元数据空间`呢?
推荐阅读
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 使用Java 1.8 编译兼容1.6 JVM 的Class文件
    本文探讨了如何使用Java 1.8 编译器生成能够在1.6 JVM 上运行的Class文件,并介绍了Spring框架中的相关配置。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 类加载机制是Java虚拟机运行时的重要组成部分。本文深入解析了类加载过程的第二阶段,详细阐述了从类被加载到虚拟机内存开始,直至其从内存中卸载的整个生命周期。这一过程中,类经历了加载(Loading)、验证(Verification)等多个关键步骤。通过具体的实例和代码示例,本文探讨了每个阶段的具体操作和潜在问题,帮助读者全面理解类加载机制的内部运作。 ... [详细]
author-avatar
手机用户2502863361
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有