java 线程 内存分配内存_漫谈JAVA语言的内存分配

在说JAVA语言的内存分配之前,我们先聊聊OS的Memory Management,这是学习操作系统课程的一个重要内容。从这里开始理解内存分配有利于理解的更深入。

我们知道物理内存是由page 和segment 方式混合管理的,映射的过程如下图所示:

从物理地址到虚地址的映射后,一个进程的内存布局大概是下图这个样子的。

Stack区用于存储local variable和函数参数,Heap区用于存储动态分配的内存,即malloc分配的内存。默认由glibc ptmalloc2管理。当然也可以替换成性能更好的tcmalloc和jemalloc。

JVM的内存管理可以分成两块,一块是native memory的管理,一块就是JAVA语言的管理。JAVA语言的内存管理当然最终基于native memory来实现。

下图是从JAVA语言看内存布局。

其中堆内存的布局又是如下的:

为了提高多线程内存分配的性能,避免在内存分配阶段有锁竞争。在Eden区其实存在TLAB(Thread local allocator buffer)区。因此,针对java语言中的新建一个对象(内存分配),存在两种情况。The thread gets a new TLAB

The object is allocated outside TLAB

TLAB的大小通常是有限的,如果线程中经常分配一个大对象/大数组,TLAB放不下,就会在Eden的outside TLAB分配,竞争就会加剧,性能就会下降。因此,建议线程中如果有大对象的频繁分配,建议减小这个大对象的尺寸,或者分成两次分配。

下面提供实际做内存分配的函数。

// JDK 7-9

_ZN11AllocTracer33send_allocation_in_new_tlab_event

_ZN11AllocTracer34send_allocation_outside_tlab_event

// JDK 10+

_ZN11AllocTracer27send_allocation_in_new_tlab

_ZN11AllocTracer28send_allocation_outside_tlab

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值