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
java 线程 内存分配内存_漫谈JAVA语言的内存分配相关推荐
- java线程同步的实现_【Java多线程系列三】实现线程同步的方法
packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;impor ...
- JAVA设计一个电视机类_漫谈Java程序设计中的接口应用
Java语言提供了一种接口(interface)机制.这种接口机制使Java的面向对象编程变得更加灵活.我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.在<Thinking in ...
- java线程 创建与启动_浅析Java中线程的创建和启动
前言 线程是一个程序内部的顺序控制流.cpu实际上在一个时间点上,只执行一个.只不过我们把cup分成了多个时间片,由于速度很快,我们看起来像是多个线程.就像你的时间分成几片,这样整体看来做事情有规律, ...
- java线程写个计时器_用Java开发C/S应用(二):启动新的线程,制作一个计时器...
接着上面的例子,我们来制作一个计时器,呃,这个例子或许有些难,我会讲的尽量详细 我先来介绍启动新线程的方法: Runnable runnable=newRunnable() {publicvoidru ...
- 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目
王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...
- java内存溢出前端_【面试笔录】内存溢出和内存泄漏
一.Java是如何管理内存的 在Java中,我们需要通过new关键字为每一个对象申请内存空间(基本数据类型除外),所有的对象都是在堆(Heap)中分配空间的. 在Java中,内存的分配是管理员决定的, ...
- linux运行java程序内存过大_排查java应用linux环境内存占用过高的问题
一.问题场景 在一个短信平台的项目中,设置了一个下发节点的Xmx为16G,但是出现了内存撑满,导致CPU过高的情况.当时的具体情况是,该应用内存占用16G,该应用CPU占用1400%(16核),服务器 ...
- java 十亿数据去重_如何在有限的内存限制下实现数十亿级手机号码去重
版权申明 原创文章:本博所有原创文章,欢迎转载,转载请注明出处,并联系本人取得授权. 版权邮箱地址:banquan@mrdwy.com 问题难点 文本和数据的去重是经常要用到的重要操作,普通数量的文本 ...
- java线程 cpu占用率_多线程程序 怎样查看每个线程的cpu占用
可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...
最新文章
- 在cmd的方式下,简化mysql的输入的方法
- Java 编程开始啦
- Centos7.6安装redis
- JVM有哪些类加载器?
- android 文件并发读写,Android下,rxJava+retrofit 并发上传文件和串行上传文件的效率为什么差不多?...
- 大数运算(1)——大数储存
- 设置su为不需要密码切换为root
- LeetCode206:Reverse Linked List
- 怎样呵护友谊_呵护真正的友情,助力漫长的人生
- #25 centos7(RHEL)系列操作系统的启动流程、systemd的特性、与命令systemctl的使用...
- 企业千人千面管理模式_一汽解放青岛汽车有限公司荣获“2020(第十六届)中国企业教育先进单位百强”...
- linux命令hexdump,Linux中hexdump命令起什么作用呢?
- 手游方舟怎么输入代码_方舟秘籍代码详细攻略介绍一览
- 数学建模数据驱动之统计学预备知识
- html5创建桌面快捷方式,iOS APP创建桌面快捷方式
- jQuery —— 实现电梯导航功能
- EOS区块链技术开发(〇)起源
- 用 texstudio, 外部 pdf 浏览器查看可以正常显示中文, 但是内置的 pdf 浏览器不能显示中文?
- 手把手教你用 Pygame 复刻游戏
- 手机耳塞 录音同时外放_如何将Android手机切换为“单声道”(这样就可以戴一副耳塞)
热门文章
- python制作图_Python做图的方法
- 学位论文是根,学术论文是叶
- 假如地球变成甜甜圈形状,世界会变成什么样子?
- oracle dba_waiters中的lockid是什么,查杀oracle lock session and table
- php html转换数组,将html标签转换为php数组
- 【使用注意】多线程导致解码混乱的情况
- 【保存】maven的pom.xml标签的xsi:schemaLocation处报错
- 数据结构实验之排序五:归并求逆序数
- identifier __ldg is undefined
- 基于英特尔® 优化分析包(OAP)的 Spark 性能优化方案