首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    全网最硬核 JVM 内存解析 - 11.元空间分配与回收流程举例

    前文我们没有提到,如何限制元空间的大小,其实就是限制 commit 的内存大小。元空间的限制不只是受限于我们的参数配置,并且前面我们提到了,元空间的内存回收也比较特殊,元空间的内存基本都是每个类加载器的 ClassLoaderData 申请并管理的,在类加载器被 GC 回收后,ClassLoaderData 管理的这些元空间也会被回收掉。所以,GC 是可能触发一部分元空间被回收了。所以元空间在设计的时候,还有一个动态限制 _capacity_until_GC,即触发 GC 的元空间占用大小。当要分配的空间导致元空间整体占用超过这个限制的时候,尝试触发 GC。这个动态限制也会在每次 GC 的时候动态扩大或者缩小。动态扩大以及缩小

    01

    GNU C++的符号改编机制介绍[转]前言正文

    众所周知,强大的C++相较于C增添了许多功能。这其中就包括类、命名空间和重载这些特性。 对于类来说,不同类中可以定义名字相同的函数和变量,彼此不会相互干扰。命名空间可以保证在各个不同名字空间内的类、函数和变量名字不会互相影响。而重载可以保证即使在同一个命名空间内的同一个类中,函数名字也可以相同,只要参数不一样就可以。 这样的设计方便了程序开发者,不用担心不同开发者都定义相同名字的函数的问题。但是,这也使得符号管理变得更为复杂。 对于在不同类中的同名函数,或者在不同名字空间中的同名函数,或者在同一名字空间或类中的同名重载函数,在最终的编译和链接过程中是怎么将它们区分开来的呢?为了支持C++这些特性,人们发明了所谓的符号改编(Name Mangling)机制。 其原理其实很简单,就是按照函数所在名字空间、类以及参数的不同,按照一定规则对函数进行重命名。不同的编译器其命名规则都不尽相同,这里我们主要介绍GNU C++编译器所使用的规则。主要分为以下几种情况: 1)全局变量: 即在命名空间和类之外的变量,改编后的符号名就是变量名,也就是不做任何修改。 2)全局函数: 以“_Z”开头,然后是函数名字符的个数,接着是函数名,最后是函数参数的别名。 关于函数参数的别名,后面还会有详细的介绍。 3)类或命名空间中的变量或函数: 以“_ZN”开头,然后是变量或函数所在名字空间或类名字的字符长度,然后接着的是真正的名字空间或类名,然后是变量或函数名的长度和变量或函数名,后面紧跟字母“E”,最后如果是函数的话则跟参数别名,如果是变量则什么都不用加。 4)构造函数和析构函数 以”_ZN”开头,然后是构造函数所在名字空间和类名字的字符长度,然后接着的是真正的名字空间或类名,然后构造函数接“C1”或者“C2”,析构函数接“D1”或者“D2”,然后加上字母“E”,最后接函数参数别名结束。 介绍完命名规则,下面我们再具体介绍一下函数参数别名的规则。主要分为下面几种情况: 1)函数参数是基本类型时 每个基本类型的别名如下表:

    04

    全网最硬核 JVM 内存解析 - 7.元空间存储的元数据

    JVM 在执行 Java 应用程序时,将加载的 Java 类的许多细节记录在内存中,这些信息称为类元数据(Class MetaData)。这些元数据对于 Java 的很多灵活的语言以及虚拟机特性都是很重要的,比如动态类加载、JIT 实时编译、反射以及动态代理等等。不同的 JVM 加载类保存的内存信息是不一样的,它们通常在更低的内存占用与更快的执行速度之间进行权衡(类似于空间还是时间的权衡)。对于 OpenJDK Hotspot 使用的则是相对丰富的元数据模型来获得尽可能快的性能(时间优先,不影响速度的情况下尽量优化空间占用)。相比于 C,C++,Go 这些离线编译为可执行二进制文件的程序相比,像 JVM 这样的托管运行时动态解释执行或者编译执行的,则需要保留更多关于正在执行的代码的运行时信息。原因如下:

    04
    领券