日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux線程??臻g大小詳解(linux線程??臻g大小)

在Linux系統(tǒng)中,線程棧是一個(gè)很重要的概念,它是用來保存函數(shù)調(diào)用過程中所需要的數(shù)據(jù)和局部變量以及函數(shù)返回地址的空間,每個(gè)線程都擁有自己的線程棧。本文將詳細(xì)介紹Linux線程??臻g大小的相關(guān)知識(shí)。

一、線程棧的概念

線程棧是進(jìn)程中每個(gè)線程都擁有的內(nèi)存空間,主要用于保存局部變量和函數(shù)調(diào)用時(shí)的數(shù)據(jù)。在Linux中,線程棧和進(jìn)程棧、用戶棧是等價(jià)的概念。線程棧的大小不同于虛擬內(nèi)存空間的大小,線程棧的大小是由線程庫來維護(hù)的。

二、線程棧的空間大小

在Linux系統(tǒng)中,線程棧的空間大小是通過線程庫來維護(hù)的,一般情況下,線程棧的大小是固定的。Linux系統(tǒng)默認(rèn)的線程棧大小為2MB,但是可以通過修改內(nèi)核參數(shù)或者線程庫的一些函數(shù)來改變線程棧的大小。

1. 修改內(nèi)核參數(shù)

在Linux系統(tǒng)中,可以通過修改內(nèi)核參數(shù)來改變線程棧的大小。可以使用命令“ulimit -s ”來修改線程棧的大小,其中指的是棧的大小,單位是KB。需要注意的是,修改內(nèi)核參數(shù)需要使用root權(quán)限。

2. 使用線程庫

除了修改內(nèi)核參數(shù),也可以使用線程庫的函數(shù)來修改線程棧的大小。例如,可以使用pthread_attr_setstacksize()函數(shù)來設(shè)置線程棧的大小,該函數(shù)的原型如下:

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

其中,attr是一個(gè)pthread_attr_t類型的指針,stacksize是線程棧的大小,以字節(jié)為單位。

三、線程棧大小的影響

線程棧的大小會(huì)影響線程的性能和穩(wěn)定性,如果線程棧的大小過小,會(huì)導(dǎo)致程序崩潰或者出現(xiàn)無法預(yù)測(cè)的錯(cuò)誤。如果線程棧的大小過大,會(huì)浪費(fèi)內(nèi)存資源,降低程序的運(yùn)行效率。

1. 線程棧大小過小

如果線程棧的大小過小,會(huì)導(dǎo)致程序崩潰或者出現(xiàn)無法預(yù)測(cè)的錯(cuò)誤。這是因?yàn)楹瘮?shù)的返回地址和局部變量都保存在線程棧中,如果線程棧的空間不足以保存這些數(shù)據(jù),就會(huì)導(dǎo)致棧溢出的錯(cuò)誤。此外,線程棧的大小還會(huì)影響遞歸函數(shù)的調(diào)用深度,如果線程棧的大小過小,遞歸函數(shù)可能會(huì)導(dǎo)致棧溢出錯(cuò)誤。

2. 線程棧大小過大

如果線程棧的大小過大,會(huì)浪費(fèi)內(nèi)存資源,降低程序的運(yùn)行效率。線程棧的大小會(huì)占用虛擬內(nèi)存空間,并且需要在內(nèi)存中分配實(shí)際的物理內(nèi)存,如果線程棧的大小過大,就會(huì)浪費(fèi)大量的內(nèi)存資源。

四、

相關(guān)問題拓展閱讀:

  • Linux里面JVM內(nèi)存怎么設(shè)置
  • 進(jìn)程內(nèi)核棧,用戶棧及 Linux 進(jìn)程棧和線程棧的區(qū)別

Linux里面JVM內(nèi)存怎么設(shè)置

jar包啟動(dòng)時(shí)指定對(duì)應(yīng)參數(shù),比如我的工程啟動(dòng)銀答命令就是這樣的

啟動(dòng)命令,打碼部分為工程名

常見參數(shù)如下

1.-Xms:初始堆大小。只鋒宏慧要啟動(dòng),就占用的堆大小。

2.-Xmx:更大堆大小。java.lang.OutOfMemoryError:Java heap這個(gè)錯(cuò)誤可以通過配置-Xms和-Xmx參數(shù)來設(shè)置。

3.-Xss:棧大小分配。棧是每個(gè)線程私有的區(qū)域,通常只有幾百K大小,決定了函數(shù)調(diào)用的深度,而局部變量、參數(shù)都分配到棧上。

當(dāng)出現(xiàn)大量局部變量,遞歸時(shí),會(huì)發(fā)生??臻gOOM(java.lang.StackOverflowError)之類的錯(cuò)誤。

4.XX:NewSize:設(shè)置新生代大小的絕對(duì)值。

5.-XX:NewRatio:設(shè)置年輕代和年老代的比值。比如設(shè)置為3,則新生代:老年代=1:3,新生代占總heap的1/4。

6.-XX:MaxPermSize:設(shè)置持久代大小。

java.lang.OutOfMemoryError:PermGenspace這個(gè)OOM錯(cuò)誤需要合理調(diào)大PermSize和MaxPermSize大小。

7.-XX:SurvivorRatio:年輕代中Eden區(qū)與兩個(gè)Survivor區(qū)的比值。注意,Survivor區(qū)有form和to兩個(gè)。比如設(shè)置為8時(shí),那么eden:form:to=8:1:1。

8.-XX:HeapDumpOnOutOfMemoryError:發(fā)生OOM時(shí)轉(zhuǎn)儲(chǔ)堆到文件,這是一個(gè)非常好的診斷方法。

9.-XX:HeapDumpPath:導(dǎo)出堆的轉(zhuǎn)儲(chǔ)文件路徑。

10.-XX:OnOutOfMemoryError:OOM時(shí),執(zhí)行一個(gè)腳本,比如發(fā)送郵件報(bào)警,重啟程序。后絕弊面跟著一個(gè)腳本的路徑。

一、堆內(nèi)存相關(guān)配置

設(shè)置歷漏堆初始值

指令1:-Xms2g

指令2:-XX:InitialHeapSize=2023m

設(shè)置堆區(qū)更大值

指令1:`-Xmx2g`

指令2: -XX:MaxHeapSize=2023m

縮小堆內(nèi)存的時(shí)機(jī)

-XX:MaxHeapFreeRatio=70//堆內(nèi)存使用率大于70時(shí)擴(kuò)張堆內(nèi)存,xms=xmx時(shí)該參數(shù)無效,默認(rèn)值70

擴(kuò)張堆內(nèi)存的時(shí)機(jī)

-XX:MinHeapFreeRatio=40//堆內(nèi)存使用率小于40時(shí)縮減堆內(nèi)存,xms=xmx時(shí)該參數(shù)無效,默認(rèn)值40

新生代內(nèi)存配置

指令1:-Xmn512m

指令2:-XX:MaxNewSize=512m

2個(gè)survivor區(qū)和Eden區(qū)大小比率

指令:-XX:SurvivorRatio=6 //S區(qū)和Eden區(qū)占新生代比率為1:6,兩個(gè)S區(qū)2:6

新生代和老年代的占比

-XX:NewRatio=4 //表示新生代:老年代 = 1:4 即老年代占整個(gè)堆的4/5;默認(rèn)值=2

二、方法區(qū)內(nèi)存配置常用參數(shù)

初始化的Metaspace大小,

-XX:MetaspaceSize :

Metaspace更大值

-XX:MaxMetaspaceSize

三、線程棧內(nèi)存配置常用參數(shù)

每個(gè)線程棧更大值

指令1:-Xss256k

指令2:-XX:ThreadStackSize=256k

注意:

棧肢擾爛設(shè)置太大,會(huì)導(dǎo)致線程創(chuàng)建減少。

棧設(shè)置小,會(huì)導(dǎo)致深入不夠,深度的遞歸會(huì)導(dǎo)致棧溢出。

建議棧深度設(shè)置在

四、配置垃圾收集器

Serial垃圾收集器(新生代)

開啟:-XX:+UseSerialGC

關(guān)閉:-XX:-UseSerialGC

//新生代使用Serial 老年代則使用SerialOld

ParNew垃圾收集器(新生代)

開啟 -XX:+UseParNewGC

關(guān)閉 -XX:-UseParNewGC

//新生代使用功能ParNew 老年代則使用功能CMS

Parallel Scavenge收集器(新生代)

開啟 -XX:+UseParallelOldGC

關(guān)閉 -XX:-UseParallelOldGC

//新生代使用功能Parallel Scavenge 老年代李滑將會(huì)使用Parallel Old收集器

ParallelOl垃圾收集器(老年代)

開啟 -XX:+UseParallelGC

關(guān)閉 -XX:-UseParallelGC

//新生代使用功能Parallel Scavenge 老年代將會(huì)使用Parallel Old收集器

CMS垃圾收集器(老年代)

開啟 -XX:+UseConcMarkSweepGC

關(guān)閉 -XX:-UseConcMarkSweepGC

G1垃圾收集器

開啟 -XX:+UseG1GC

關(guān)閉 -XX:-UseG1GC

五、GC策略配置

GC并行執(zhí)行線程數(shù)

-XX:ParallelGCThreads=16

新生代可容納的更大對(duì)象

-XX:PretenureSizeThreshold=//大于此值的對(duì)象直接會(huì)分配到老年代,設(shè)置為0則沒有限制。 //避免在Eden區(qū)和Survivor區(qū)發(fā)生大量的內(nèi)存復(fù)制,該參數(shù)只對(duì)Serial和ParNew收集器有效,Parallel Scavenge并不認(rèn)識(shí)該參數(shù)

進(jìn)入老年代的GC年齡

進(jìn)入老年代最小的GC年齡

-XX:InitialTenuringThreshol=7 //年輕代對(duì)象轉(zhuǎn)換為老年代對(duì)象最小年齡值,默認(rèn)值7,對(duì)象在堅(jiān)持過一次Minor GC之后,年齡就加1,每個(gè)對(duì)象在堅(jiān)持過一次Minor GC之后,年齡就增加1

進(jìn)入老年代更大的GC年齡

-XX:MaxTenuringThreshold=15 //年輕代對(duì)象轉(zhuǎn)換為老年代對(duì)象更大年齡值,默認(rèn)值15

六、GC日志信息配置

配置GC文件路徑

-Xloggc:/data/gclog/gc.log//固定路徑名稱生成 -Xloggc:/home/GCEASY/gc-%t.log //根據(jù)時(shí)間生成

滾動(dòng)生成日志

日志文件達(dá)到一定大小后,生成另一個(gè)文件。須配置Xloggc

開啟 -XX:+UseGCLogFileRotation

關(guān)閉 -XX:-UseGCLogFileRotation

-XX:NumberOfGCLogFiles=4 //滾動(dòng)GC日志文件數(shù),默認(rèn)0,不滾動(dòng) -XX:GCLogFileSize=100k //GC文件滾動(dòng)大小,需配置UseGCLogFileRotation,設(shè)置為0表示僅通過jcmd命令觸發(fā)

進(jìn)程內(nèi)核棧,用戶棧及 Linux 進(jìn)程棧和線程棧的區(qū)別

總結(jié):線程棧的空間悔正指開辟在所屬進(jìn)程的堆區(qū),線程與其所屬的進(jìn)程共享進(jìn)程的用戶空間,所以線程棧之間可以互訪。線程棧的起始地址和大小存放在pthread_attr_t 中,棧的大小并不是用來判斷棧是否越界,而是用來初始化避免棧溢出的緩沖區(qū)的大?。ɑ蛘哒f安全間隙清猜的大?。?/p>

進(jìn)程內(nèi)核棧、用戶棧

1.進(jìn)程的堆棧

內(nèi)核在創(chuàng)建進(jìn)程的時(shí)候,在創(chuàng)建task_struct的同事,會(huì)為進(jìn)程創(chuàng)建相應(yīng)的堆棧。每個(gè)進(jìn)程會(huì)有兩個(gè)棧,一個(gè)用戶棧,存在于用戶空間,一個(gè)內(nèi)核棧,存 在于內(nèi)核空間。當(dāng)進(jìn)程在用戶空間運(yùn)行碧配時(shí),cpu堆棧指針寄存器里面的內(nèi)容是用戶堆棧地址,使用用戶棧;當(dāng)進(jìn)程在內(nèi)核空間時(shí),cpu堆棧指針寄存器里面的內(nèi) 容是內(nèi)核??臻g地址,使用內(nèi)核棧。

2.進(jìn)程用戶棧和內(nèi)核棧的切換

當(dāng)進(jìn)程因?yàn)橹袛嗷蛘呦到y(tǒng)調(diào)用而陷入內(nèi)核態(tài)之行時(shí),進(jìn)程所使用的堆棧也要從用戶棧轉(zhuǎn)到內(nèi)核棧。

進(jìn)程陷入內(nèi)核態(tài)后,先把用戶態(tài)堆棧的地址保存在內(nèi)核棧之中,然后設(shè)置堆棧指針寄存器的內(nèi)容為內(nèi)核棧的地址,這樣就完成了用戶棧向內(nèi)核棧的轉(zhuǎn)換;當(dāng)進(jìn)程從內(nèi) 核態(tài)恢復(fù)到用戶態(tài)之行時(shí),在內(nèi)核態(tài)之行的最后將保存在內(nèi)核棧里面的用戶棧的地址恢復(fù)到堆棧指針寄存器即可。這樣就實(shí)現(xiàn)了內(nèi)核棧和用戶棧的互轉(zhuǎn)。

那么,我們知道從內(nèi)核轉(zhuǎn)到用戶態(tài)時(shí)用戶棧的地址是在陷入內(nèi)核的時(shí)候保存在內(nèi)核棧里面的,但是在陷入內(nèi)核的時(shí)候,我們是如何知道內(nèi)核棧的地址的呢?

關(guān)鍵在進(jìn)程從用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)的時(shí)候,進(jìn)程的內(nèi)核??偸强盏摹_@是因?yàn)?,?dāng)進(jìn)程在用戶態(tài)運(yùn)行時(shí),使用的是用戶棧,當(dāng)進(jìn)程陷入到內(nèi)核態(tài)時(shí),內(nèi) 核棧保存進(jìn)程在內(nèi)核態(tài)運(yùn)行的相關(guān)信心,但是一旦進(jìn)程返回到用戶態(tài)后,內(nèi)核棧中保存的信息無效,會(huì)全部恢復(fù),因此每次進(jìn)程從用戶態(tài)陷入內(nèi)核的時(shí)候得到的內(nèi)核 棧都是空的(為什么?)。所以在進(jìn)程陷入內(nèi)核的時(shí)候,直接把內(nèi)核棧的棧頂?shù)刂方o堆棧指針寄存器就可以了。

3.內(nèi)核棧的實(shí)現(xiàn)

內(nèi)核棧在kernel-2.4和kernel-2.6里面的實(shí)現(xiàn)方式是不一樣的。

在kernel-2.4內(nèi)核里面,內(nèi)核棧的實(shí)現(xiàn)是:

Union task_union {

Struct task_struct task;

Unsigned long stack;

};

其中,INIT_STACK_SIZE的大小只能是8K。

內(nèi)核為每個(gè)進(jìn)程分配task_struct結(jié)構(gòu)體的時(shí)候,實(shí)際上分配兩個(gè)連續(xù)的物理頁面,底部用作task_struct結(jié)構(gòu)體,結(jié)構(gòu)上面的用作堆棧。使用current()宏能夠訪問當(dāng)前正在運(yùn)行的進(jìn)程描述符。

注意:這個(gè)時(shí)候task_struct結(jié)構(gòu)是在內(nèi)核棧里面的,內(nèi)核棧的實(shí)際能用大小大概有7K。

內(nèi)核棧在kernel-2.6里面的實(shí)現(xiàn)是(kernel-2.6.32):

Union thread_union {

Struct thread_info thread_info;

Unsigned long stack;

};

其中THREAD_SIZE的大小可以是4K,也可以是8K,thread_info占52bytes。

當(dāng)內(nèi)核棧為8K時(shí),Thread_info在這塊內(nèi)存的起始地址,內(nèi)核棧從堆棧末端向下增長。所以此時(shí),kernel-2.6中的current宏是需要 更改的。要通過thread_info結(jié)構(gòu)體中的task_struct域來獲得于thread_info相關(guān)聯(lián)的task。更詳細(xì)的參考相應(yīng)的 current宏的實(shí)現(xiàn)。

struct thread_info {

struct task_struct *task;

struct exec_domain *exec_domain;

__u32 flags;

__u32 status;

__u32 cpu;

… ..

};

關(guān)于linux 線程??臻g大小的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


本文名稱:Linux線程??臻g大小詳解(linux線程??臻g大小)
文章出自:http://www.5511xx.com/article/cdocisj.html