jdk(G1GC)中的堆分配源代码
Heap allocation source code in in jdk(G1GC)
我想了解 java 如何在堆中分配对象。我想知道在使用“new”关键字时触发了 JDK 代码的哪些部分。
我如何定义一个函数,用户可以从 java 代码中调用该函数并将在 JDK 源代码中实现功能?
我知道 jdk14 使用 G1GC 作为默认垃圾收集器并且 G1GC 代码存在于 jdk14/src/hotspot/share/GC/G1 文件夹中,但我无法遵循 G1Allocator 为用户线程分配内存(如果有的话)。
任何已知的实现在分配内存时默认使用TLAB
(线程本地分配缓冲区)。没有它 - 分配会慢得多。虽然我没有深入研究这个主题的代码,但您可以从 here, for example.
开始
关于请求 new
时发生的情况,源代码中有一条非常好的评论 here。基本上,如果可以使用 TLAB
(例如,一个对象不大于那个),它将是;否则将完成每个 new
的原始 malloc
。
关于G1
,这里是它的主要功能。 A general explanation 再次出现在评论中,并带有一个短语:
All non-TLAB allocation requests should go to mem_allocate()
mem_allocate
的作用可以从here开始。
我想了解 java 如何在堆中分配对象。我想知道在使用“new”关键字时触发了 JDK 代码的哪些部分。 我如何定义一个函数,用户可以从 java 代码中调用该函数并将在 JDK 源代码中实现功能? 我知道 jdk14 使用 G1GC 作为默认垃圾收集器并且 G1GC 代码存在于 jdk14/src/hotspot/share/GC/G1 文件夹中,但我无法遵循 G1Allocator 为用户线程分配内存(如果有的话)。
任何已知的实现在分配内存时默认使用TLAB
(线程本地分配缓冲区)。没有它 - 分配会慢得多。虽然我没有深入研究这个主题的代码,但您可以从 here, for example.
关于请求 new
时发生的情况,源代码中有一条非常好的评论 here。基本上,如果可以使用 TLAB
(例如,一个对象不大于那个),它将是;否则将完成每个 new
的原始 malloc
。
关于G1
,这里是它的主要功能。 A general explanation 再次出现在评论中,并带有一个短语:
All non-TLAB allocation requests should go to mem_allocate()
mem_allocate
的作用可以从here开始。