執行緒記憶體分配測試
關於程序棧和執行緒棧總結:
(1)程序棧大小時執行時確定的,與編譯連結無關
(2)程序棧大小是隨機確認的,至少比執行緒棧要大,但不會超過2倍
(3)執行緒棧是固定大小的,可以使用ulimit -a 檢視,使用ulimit -s 修改
(4)一般預設情況下,執行緒棧是在程序的堆中分配棧空間,每個執行緒擁有獨立的棧空間,為了避免執行緒之間的棧空間踩踏,執行緒棧之間還會有以小塊guardsize用來隔離保護各自的棧空間,一旦另一個執行緒踏入到這個隔離區,就會引發段錯誤。
看我的測試程式碼:
#include <stdlib.h> #include <stdio.h> #include <pthread.h> void *thread_task(void *arg){ // int a[1024] = {0}; // a[1] = 10; return (void *)0; } int main(void) { pthread_t tid; int ret = pthread_create(&tid, NULL, thread_task, (void *)NULL); if(ret < 0){ perror("pthread_create"); exit(0); } while(1){} pthread_join(tid, NULL); }
程式碼很簡單,建立了一個執行緒。下面我們檢視它的記憶體分配:
cd /proc/11858
vim maps
通過計算可以看出一個執行緒實際分配了8m+4k的空間。當然8m可以通過ulimit -s來調整。為什麼有4k保護頁呢?
一般預設情況下,執行緒棧是在程序的堆中分配棧空間,每個執行緒擁有獨立的棧空間,為了避免執行緒之間的棧空間踩踏,執行緒棧之間還會有以小塊guardsize用來隔離保護各自的棧空間,一旦另一個執行緒踏入到這個隔離區,就會引發段錯誤。
看下面追蹤程式碼的執行:
這4k是通過mprotect來分配的4096位元組。
補充:最近寫程式碼用到一個命令可以檢視執行緒記憶體分配的命令----pmap
使用這個命令輸出的結果同樣證明上面的結論,截圖+說明如下:
圖上圈出來的就是執行緒的記憶體,8192k+4k。
相關推薦
執行緒記憶體分配測試
關於程序棧和執行緒棧總結: (1)程序棧大小時執行時確定的,與編譯連結無關 (2)程序棧大小是隨機確認的,至少比執行緒棧要大,但不會超過2倍 (3)執行緒棧是固定大小的,可以使用ulimit -a 檢視,使用ulimit -s 修改 (4
提高C++效能的程式設計技術筆記:多執行緒記憶體池+測試程式碼
為了使多個執行緒併發地分配和釋放記憶體,必須在分配器方法中新增互斥鎖。 全域性記憶體管理器(通過new()和delete()實現)是通用的,因此它的開銷也非常大。 因為單執行緒記憶體管理器要比多執行緒記憶體管理器快的多,所以如果要分配的大多數記憶體塊限於單執行緒中使用,那麼可以顯著提升效
提高C++效能的程式設計技術筆記:單執行緒記憶體池+測試程式碼
頻繁地分配和回收記憶體會嚴重地降低程式的效能。效能降低的原因在於預設的記憶體管理是通用的。應用程式可能會以某種特定的方式使用記憶體,並且為不需要的功能付出效能上的代價。通過開發專用的記憶體管理器可以解決這個問題。對專用記憶體管理器的設計可以從多個角度考慮。我們至少可以想到兩個方面:大小和併發。
Kafka的單執行緒生產消費測試
程式碼: package com.weichai.kafka; import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.KeyedMessage; import
多執行緒記憶體問題分析之mprotect方法【轉】
轉自:https://blog.csdn.net/agwtpcbox/article/details/53230664 http://www.yebangyu.org/blog/2016/02/01/detectmemoryghostinmultithread/ 多執行緒中的記憶體問題,一直被認為是噩夢般
JDK6u25裡新增的按執行緒統計分配記憶體量: JMX
轉載自 http://rednaxelafx.iteye.com/blog/1021619 Oracle幾天前釋出的JDK 6 update 25裡新增的一個新功能非常有趣,可以按照執行緒來跟蹤(GC堆)記憶體的分配量。這個功能在VM核心、直譯器、C1編譯器、C2編譯器以及GC中都有程
執行緒記憶體的可見性
先看下面的程式碼和執行的結果: package hello_java; public class MemoryVisiable { public static void main(String[] args) { ShareData02 shareData = ne
1.JVM之對Vector執行緒安全的測試(相對執行緒安全)
import java.util.Vector; public class vector { private static Vector<Integer> vector=new Vector<>(); public static void main(Stri
python編寫的多執行緒介面併發測試
import requests import json import threading import time import uuid class postrequests(): def __init__(self): #產生UUID
【Nim】執行緒記憶體模型
在Nim的設計中,每一個執行緒都有自己一個獨立的heap,這意味著在多個執行緒之間不能引用同一個變數,帶來的好處是不會出現競態條件(race condition),壞處也很明顯,多執行緒之間無法共享變數。 讓我們來看個簡單的例子感受一下。為了引入多執行緒,我安裝了第三方庫w
java程式執行的記憶體分配小記
五個資料儲存區: 一、暫存器:最快的儲存區,位於處理器內部,但是數量有限,需要根據需求進行分配,所以無法由程式直接控制。 二、堆疊:位於通用RAM(隨機訪問儲存器)中,通過堆疊指標可以獲得直接支援,指標向下移動,即分配新的記憶體,指標向上移動,則釋放記憶體,速度僅次於暫存
使用GroboUtils多執行緒併發請求測試springmvc controller
1. 需求 有一個下載pdf的springmvc controller,希望模擬一下併發訪問的情況,怎麼辦呢? 2. 解決方案 由於是pdf,其http響應為 那麼我們訪問時返回的是二進位制,而不是網頁那種text/html 於是寫一個儲存二進位制檔案的方
由多執行緒記憶體溢位產生的實戰分析
一日凌晨,手機瘋狂報警,簡訊以摧枯拉朽之勢瞬間以百條的速度到達,我在睡夢中被驚醒,看到簡訊的部分內容如下: Caused by: java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thr
java多執行緒-記憶體模型
併發處理的廣泛應用是使得amdahl定律代替摩爾定律成為計算機效能發展源動力的根本原因,是人類壓榨計算機運算能力的最有力武器。 上一篇《java 多執行緒—執行緒怎麼來的 》中我們瞭解了執行緒在作業系統中的是如何派生出來的,這一篇我們聊聊jvm的記憶體模型,瞭解一些jvm在
第四回 關於多執行緒渲染(續--測試資料)
*.主執行緒渲染時間: 是指主執行緒中渲染各個遊戲物件所花的時間,其中包括與渲染相關的一些CPU計算,以及大量對D3D API的呼叫,在不使用多執行緒渲染的時候,這些呼叫被直接傳遞給D3D,在使用多執行緒渲染的時候,這些呼叫被轉化為多條指令加入到一個佇列中.注意這個時間沒有包括等待GPU工作完畢的時間.
java執行緒記憶體模型,執行緒、工作記憶體、主記憶體
java執行緒記憶體模型 執行緒、工作記憶體、主記憶體三者之間的互動關係圖: key edeas 所有執行緒共享主記憶體 每個執行緒有自己的工作記憶體 refreshing local memory to/from main memory must co
linux執行緒排程方式測試總結
總結:對三種執行緒排程方式進行測試。 1.SCHED_OTHER:分時排程策略,為預設方式,凡是採用本模式的執行緒,執行緒優先順序會強制為0,通俗點將,工作在本模式下的執行緒,都在同一優先順序下。所謂的“分時排程策略”,可以理解為執行緒執行一次後主動放棄CPU,執行緒排程一次,執行下一個執行緒。
python多執行緒http壓力測試指令碼
#coding=utf-8 import sys import time import thread import httplib, urllib import random import uuid import logging logging.basicCo
Netty學習之旅------原始碼分析Netty執行緒本地分配機制與PooledByteBuf執行緒級物件池原理分析
final PoolArena<byte[]> heapArena; //使用輪叫輪詢機制,每個執行緒從heapArena[]中獲取一個,用於記憶體分配。 final PoolArena<ByteBuffer> directArena;
多執行緒--做單元測試時,使用執行緒池發現並沒有執行指定程式碼,直接跳過
案例 今天做單元測試除錯介面,發現介面呼叫成功但是並沒有執行執行緒池執行的方法,而是直接跳過執行程式碼 ExecutorService pool = Executors.newFixedThre