在说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

java 线程 内存分配内存_漫谈JAVA语言的内存分配相关推荐

  1. java线程同步的实现_【Java多线程系列三】实现线程同步的方法

    packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;impor ...

  2. JAVA设计一个电视机类_漫谈Java程序设计中的接口应用

    Java语言提供了一种接口(interface)机制.这种接口机制使Java的面向对象编程变得更加灵活.我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.在<Thinking in ...

  3. java线程 创建与启动_浅析Java中线程的创建和启动

    前言 线程是一个程序内部的顺序控制流.cpu实际上在一个时间点上,只执行一个.只不过我们把cup分成了多个时间片,由于速度很快,我们看起来像是多个线程.就像你的时间分成几片,这样整体看来做事情有规律, ...

  4. java线程写个计时器_用Java开发C/S应用(二):启动新的线程,制作一个计时器...

    接着上面的例子,我们来制作一个计时器,呃,这个例子或许有些难,我会讲的尽量详细 我先来介绍启动新线程的方法: Runnable runnable=newRunnable() {publicvoidru ...

  5. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  6. java内存溢出前端_【面试笔录】内存溢出和内存泄漏

    一.Java是如何管理内存的 在Java中,我们需要通过new关键字为每一个对象申请内存空间(基本数据类型除外),所有的对象都是在堆(Heap)中分配空间的. 在Java中,内存的分配是管理员决定的, ...

  7. linux运行java程序内存过大_排查java应用linux环境内存占用过高的问题

    一.问题场景 在一个短信平台的项目中,设置了一个下发节点的Xmx为16G,但是出现了内存撑满,导致CPU过高的情况.当时的具体情况是,该应用内存占用16G,该应用CPU占用1400%(16核),服务器 ...

  8. java 十亿数据去重_如何在有限的内存限制下实现数十亿级手机号码去重

    版权申明 原创文章:本博所有原创文章,欢迎转载,转载请注明出处,并联系本人取得授权. 版权邮箱地址:banquan@mrdwy.com 问题难点 文本和数据的去重是经常要用到的重要操作,普通数量的文本 ...

  9. java线程 cpu占用率_多线程程序 怎样查看每个线程的cpu占用

    可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...

最新文章

  1. 在cmd的方式下,简化mysql的输入的方法
  2. Java 编程开始啦
  3. Centos7.6安装redis
  4. JVM有哪些类加载器?
  5. android 文件并发读写,Android下,rxJava+retrofit 并发上传文件和串行上传文件的效率为什么差不多?...
  6. 大数运算(1)——大数储存
  7. 设置su为不需要密码切换为root
  8. LeetCode206:Reverse Linked List
  9. 怎样呵护友谊_呵护真正的友情,助力漫长的人生
  10. #25 centos7(RHEL)系列操作系统的启动流程、systemd的特性、与命令systemctl的使用...
  11. 企业千人千面管理模式_一汽解放青岛汽车有限公司荣获“2020(第十六届)中国企业教育先进单位百强”...
  12. linux命令hexdump,Linux中hexdump命令起什么作用呢?
  13. 手游方舟怎么输入代码_方舟秘籍代码详细攻略介绍一览
  14. 数学建模数据驱动之统计学预备知识
  15. html5创建桌面快捷方式,iOS APP创建桌面快捷方式
  16. jQuery —— 实现电梯导航功能
  17. EOS区块链技术开发(〇)起源
  18. 用 texstudio, 外部 pdf 浏览器查看可以正常显示中文, 但是内置的 pdf 浏览器不能显示中文?
  19. 手把手教你用 Pygame 复刻游戏
  20. 手机耳塞 录音同时外放_如何将Android手机切换为“单声道”(这样就可以戴一副耳塞)

热门文章

  1. python制作图_Python做图的方法
  2. 学位论文是根,学术论文是叶
  3. 假如地球变成甜甜圈形状,世界会变成什么样子?
  4. oracle dba_waiters中的lockid是什么,查杀oracle lock session and table
  5. php html转换数组,将html标签转换为php数组
  6. 【使用注意】多线程导致解码混乱的情况
  7. 【保存】maven的pom.xml标签的xsi:schemaLocation处报错
  8. 数据结构实验之排序五:归并求逆序数
  9. identifier __ldg is undefined
  10. 基于英特尔® 优化分析包(OAP)的 Spark 性能优化方案