android棧大小
❶ 堆棧大小是多少,可否設置
/STACK選項設置堆棧的大小(以位元組為單位)。此選項僅在生成.exe文件時使用。reserve值指定虛擬內存中的總的堆棧分配。對於x86和x64計算機,默認堆棧大小為1MB。在Itanium晶元組上,默認大小為4MB。commit取決於操作系統所作的解釋。在WindowsNT和Windows2000中,它指定一次分配的物理內存量。提交的虛擬內存導致空間被保留在頁面文件中。更高的commit值在應用程序需要堆棧空間時可節省時間,但會增加內存需求並有可能延長啟動時間。對於x86和x64計算機,默認提交值為4KB。在Itanium晶元組上,默認值為16KB。以十進制或C語言表示法指定reserve值和commit值。
❷ 可以申請100M以上的棧內存
不可以。棧內存是指程首洞灶序輸出的值大概就是棧能申請的最大內存,默認顫冊的棧空間大小是有限制者扮只有1M所以是不可以申請100M以上的。
❸ C中棧的內存有多大!
棧的內存空間大小是可以自己定義的,沒規定多大,但是一個棧段的容量最大為64KB
因為一個棧段最大容量為65536位元組,除以1024就是64KB
❹ 一個函數產生堆棧的大小和什麼有關
和操作系統有關系
不同的操作系統對於棧的默認大小是有規定談數廳的。對於linux系統,默認的棧空間是10M。對於Windows系統,默認的空間是1M。但是棧的空間是可以調整的含隱,在編譯器的編譯屬畢或性更改
❺ 怎麼查看android app堆棧大小
方法-:下載任務管理程序 像TaskManager 一類的裝上 就可以看到
方法二:adb shell top ; Android 基於linux 所以簡單的linux 命令還是支持的
方法三:setting -》 dev tools -》 running process
❻ Android 任務棧
任務是指在執行特定作業時與用擾芹戶交互的一系列 Activity。 這些 Activity 按照各自的打首仔開順序排列在堆棧(即返回棧)中。設備主屏幕是大多數任務的起點。當用戶觸摸應用啟動器中的圖標(或主屏幕上的快捷方式)時,該應用的任務將出現在前台。 如果應用不存在任務(應用最近未曾使用),則會創建一個新任務,並且該應用的「主」Activity 將作為堆棧中的根 Activity 打開。
當前 Activity 啟動另一個 Activity 時,該新 Activity 會被推送到堆棧頂部,成為焦點所在。 前一個 Activity 仍保留在堆棧中,但是處於停止狀態。Activity 停止時,系統會保持其用戶界面的當前狀態。 用戶按「返回」按鈕時,當前 Activity 會從堆棧頂部彈出(Activity 被銷毀),而前一個 Activity 恢復執行(恢復其 UI 的前一狀態)。 堆棧中的 Activity 永遠不會重新排列,僅推入和彈出堆棧:由當前 Activity 啟動時推入堆棧;用戶使用「返回」按鈕退出時彈出堆棧。 因此,返回棧以「後進先出」對象結構運行。
上述文字摘自 Android開發者官網
默認行為的場景 :當前的task包含4個activity–當前activity下面有3個activity。當用戶按下HOME鍵返回到程序啟動器(application launcher)後,選擇了一個新的應用程序(事實上是一個新的task),當前的task就被轉移到後台,新的task中的根activity將被顯示在屏幕上。過了一段時間,用者李汪戶按返回鍵回到了程序啟動器界面,選擇了之前運行的程序(之前的task)。那個task,仍然包含著4個activity。當用戶再次按下返回鍵時,屏幕不會顯示之前留下的那個activity(之前的task的根activity),而顯示當前activity從task棧中移出後棧頂的那個activity。
❼ 一個進程的堆和棧有多大
棧是線程的,不是進程的
是一個進程一個堆,一個線程一個棧嗎
堆≈虛擬內存大小-1GB
棧通常為4MB
下面是一些說明文件:
Visual C++ 編譯器選項
/F(設置堆棧大小)
請參見 發送反饋意見
設置程序堆棧大小(以位元組為單位)。
/F[ ]number
參數
number
堆棧大小(以位元組為單位)。
備注
如果不使用此選項,堆棧大小默認為 1 MB。number 參數可以用十進制或 C 語言表示法表示。參數的范圍可以在 1 到鏈接器接受的最大堆棧大小之間。鏈接器將指定值向上舍入為最接近的 4 個位元組。/F 和 number 之間的空格可選的。
❽ Android 多返回棧技術詳解
用戶通過系統返回按鈕導航回去的一組頁面,在開發中被稱為返回棧 (back stack)。多返回棧即一堆 "返回棧",對多返回棧的支持是在 Navigation 2.4.0-alpha01 和 Fragment 1.4.0-alpha01 中開始的。本文將為您展開多返回棧的技術詳解。
無論您在使用 Android 全新的 手勢導航 還是傳統的導航欄,用戶的 "返回" 操作是 Android 用戶體驗中關鍵的一環,把握好返回功能的設計可以使應用更加貼近整個生態系統。
在最簡單的應用場景中,系統返回按鈕僅僅 finish 您的 Activity。在過去您可能需要覆寫 Activity 的 onBackPressed() 方法來自定義返回操作,而在 2021 年您無需再這樣操作。我們已經在 OnBackPressedDispatcher 中提供了 針對自定義返回導航的 API。實際上這與 FragmentManager 和 NavController 中 已經 添加的 API 相同。
這意味著當您使用 Fragments 或 Navigation 時,它們會通過 OnBackPressedDispatcher 來確保您調用了它們返回棧的 API,系統的返回按鈕會將您推入返回棧的頁面逐層返回。
多返回棧不會改變這個基本邏輯。系統的返回按鈕仍然是一個單向指令 —— "返回"。這對多返回棧 API 的實現機制有深遠影響。
在 surface 層級,對於 多返回棧的支持 貌似很直接,但其實需要額外解釋一下 "Fragment 返回棧" 到底是什麼。FragmentManager 的返回棧其實包含的不是 Fragment,而是由 Fragment 事務組成的。更准確地說,是由那些調用了 addToBackStack(String name) API 的事務組成的。
這就意味著當您調用 commit() 提交了一個調用過 addToBackStack() 方法的 Fragment 事務時, FragmentManager 會執行所有您在事務中所指定的操作 (比如 替換操作 ),從而將每個 Fragment 轉換為預期的狀態。然後 FragmentManager 會將該事務作為它返回棧的一部分。
當您調用 popBackStack() 方法時 (無論是直接調用,還是通過系統返回鍵以 FragmentManager 內部機制調用),Fragment 返回棧的最上層事務會從棧中彈出 -- 比如新添加的 Fragment 會被移除,隱藏的 Fragment 會顯示。這會使得 FragmentManager 恢復到最初提交 Fragment 事務之前的狀態。
也就是說 popBackStack() 變成了銷毀操作: 任何已添加的 Fragment 在事務被彈出的時候都會丟失它的狀態。換言之,您會失去視圖的狀態,任何所保存的實例狀態 (Saved Instance State),並且任何綁定到該 Fragment 的 ViewModel 實例都會被清除。這也是該 API 和新的 saveBackStack() 方法之間的主要區別。 saveBackStack() 可以實現彈出事務所實現的返回效果,此外它還可以確保視圖狀態、已保存的實例狀態,以及 ViewModel 實例能夠在銷毀時被保存。這使得 restoreBackStack() API 後續可以通過已保存的狀態重建這些事務和它們的 Fragment,並且高效 "重現" 已保存的全部細節。太神奇了!
而實現這個目的必須要解決大量技術上的問題。
雖然 Fragment 總是會保存 Fragment 的視圖狀態,但是 Fragment 的 onSaveInstanceState() 方法只有在 Activity 的 onSaveInstanceState() 被調用時才會被調用。為了能夠保證調用 saveBackStack() 時 SavedInstanceState 會被保存,我們 還 需要在 Fragment 生命周期切換 的正確時機注入對 onSaveInstanceState() 的調用。我們不能調用得太早 (您的 Fragment 不應該在 STARTED 狀態下保存狀態),也不能調用得太晚 (您需要在 Fragment 被銷毀之前保存狀態)。
這樣的前提條件就開啟了需要 解決 FragmentManager 轉換到對應狀態的問題,以此來保障有一個地方能夠將 Fragment 轉換為所需狀態,並且處理可重入行為和 Fragment 內部的狀態轉換。
在 Fragment 的重構工作進行了 6 個月,進行了 35 次修改時,發現 Postponed Fragment 功能已經嚴重損壞,這一問題使得被推遲的事務處於一個中間狀態 —— 既沒有被提交也並不是未被提交。之後的 65 個修改和 5 個月的時間里,我們幾乎重寫了 FragmentManager 管理狀態、延遲狀態切換和動畫的內部代碼,具體請參見我們之前的文章《全新的 Fragment: 使用新的狀態管理器》。
隨著技術問題的逐步解決,包括更加可靠和更易理解的 FragmentManager ,我們新增加了兩個 API: saveBackStack() 和 restoreBackStack() 。
如果您不使用這些新增 API,則一切照舊: 單個 FragmentManager 返回棧和之前的功能相同。現有的 addToBackStack() 保持不變 —— 您可以將 name 賦值為 null 或者任意 name 。然而,當您使用多返回棧時, name 的作用就非常重要了: 在您調用 saveBackStack() 和之後的 restoreBackStack() 方法時,它將作為 Fragment 事務的唯一的 key。
舉個例子,會更容易理解。比如您已經添加了一個初始的 Fragment 到 Activity,然後提交了兩個事務,每個事務中包含一個單獨的 replace 操作:
也就是說我們的 FragmentManager 會變成這樣:
比如說我們希望將 profile 頁換出返回棧,然後切換到通知 Fragment。這就需要調用 saveBackStack() 並且緊跟一個新的事務:
現在我們添加 ProfileFragment 的事務和添加 EditProfileFragment 的事務都保存在 "profile" 關鍵字下。這些 Fragment 已經完全將狀態保存,並且 FragmentManager 會隨同事務狀態一起保持它們的狀態。很重要的一點: 這些 Fragment 的實例並不在內存中或者在 FragmentManager 中 —— 存在的僅僅只有狀態 (以及任何以 ViewModel 實例形式存在的非配置狀態)。
替換回來非常簡單: 我們可以在 "notifications" 事務中同樣調用 saveBackStack() 操作,然後調用 restoreBackStack() :
這兩個堆棧項高效地交換了位置:
維持一個單獨且活躍的返回棧並且將事務在其中交換,這保證了當返回按鈕被點擊時, FragmentManager 和系統的其他部分可以保持一致的響應。實際上,整個邏輯並未改變,同之前一樣,仍然彈出 Fragment 返回棧的最後一個事務。
這些 API 都特意按照最小化設計,盡管它們會產生潛在的影響。這使得開發者可以基於這些介面設計自己的結構,而無需通過任何非常規的方式保存 Fragment 的視圖狀態、已保存的實例狀態、非配置的狀態。
當然了,如果您不希望在這些 API 之上構建您的框架,那麼可以使用我們所提供的框架進行開發。
Navigation Component 最初 是作為通用運行時組件進行開發的,其中不涉及 View、Fragment、Composable 或者其他屏幕顯示相關類型及您可能會在 Activity 中實現的 "目的地界面"。然而,NavHost 介面 的實現中需要考慮這些內容,通過它添加一個或者多個 Navigator 實例時,這些實例 確實 清楚如何與特定類型的目的地進行交互。
這也就意味著與 Fragment 的交互邏輯全部封裝在了 navigation-fragment 開發庫和它其中的 FragmentNavigator 與 DialogFragmentNavigator 中。類似的,與 Composable 的交互邏輯被封裝在完全獨立的 navigation-compose 開發庫和它的 ComposeNavigator 中。這里的抽象設計意味著如果您希望僅僅通過 Composable 構建您的應用,那麼當您使用 Navigation Compose 時無需任何涉及到 Fragment 的依賴。
該級別的分離意味著 Navigation 中有兩個層次來實現多返回棧:
仍需特別注意那些 尚未 更新的 Navigator ,它們無法支持保存自身狀態。底層的 Navigator API 已經整體重寫來支持狀態保存 (您需要覆寫新增的 navigate() 和 popBackStack() API 的重載方法,而不是覆寫之前的版本),即使 Navigator 並未更新, NavController 仍會保存 NavBackStackEntry 的狀態 (在 Jetpack 世界中向後兼容是非常重要的)。
如果您僅僅在應用中使用 Navigation,那麼 Navigator 這個層面更多的是實現細節,而不是您需要直接與之交互的內容。可以這么說,我們已經完成了將 FragmentNavigator 和 ComposeNavigator 遷移到新的 Navigator API 的工作,使其能夠正確地保存和恢復它們的狀態,在這個層面上您無需再做任何額外工作。
如果您正在使用 NavigationUI,它是用於連接您的 NavController 到 Material 視圖組件的一系列專用助手,您會發現對於菜單項、 BottomNavigationView (現在叫 NavigationRailView ) 和 NavigationView ,多返回棧是 默認啟用 的。這就意味著結合 navigation-fragment 和 navigation-ui 使用就可以。
NavigationUI API 是基於 Navigation 的其他公共 API 構建的,確保您可以准確地為自定義組件構建您自己的版本。保證您可以構建所需的自定義組件。啟用保存和恢復返回棧的 API 也不例外,在 Navigation XML 中通過 NavOptions 上的新 API,也就是 navOptions Kotlin DSL,以及 popBackStack() 的重載方法可以幫助您指定 pop 操作保存狀態或者指定 navigate 操作來恢復之前已保存的狀態。
比如,在 Compose 中,任何全局的導航模式 (無論是底部導航欄、導航邊欄、抽屜式導航欄或者任何您能想到的形式) 都可以使用我們在與 底部導航欄集成 所介紹的相同的技術,並且結合 saveState 和 restoreState 屬性一起調用 navigate() :
對用戶來說,最令人沮喪的事情之一便是丟失之前的狀態。這也是為什麼 Fragment 用一整頁來講解 保存與 Fragment 相關的狀態,而且也是我非常樂於更新每個層級來支持多返回棧的原因之一:
如果您希望了解 更多使用該 API 的示例,請參考 NavigationAdvancedSample (它是最新更新的,且不包含任何用於支持多返回棧的 NavigationExtensions 代碼)。
對於 Navigation Compose 的示例,請參考 Tivi。
如果您遇到任何問題,請使用官方的問題追蹤頁面提交關於 Fragment 或者 Navigation 的 bug,我們會盡快處理。
❾ android怎麼壓縮一個bitmap佔用空間大小
在Android應用里,最耗費內存的就是圖片資源。而且在Android系統中,讀取點陣圖Bitmap時,分給虛擬機中的圖片的堆棧大小隻有8M,如果超出了,就會出現OutOfMemory異常。所以,對於圖片的內存優化,是Android應用開發中比較重要的內容。 1) 要及時回收Bitmap的內存 Bitmap類有一個方法recycle(),從方法名可以看出意思是回收。這里就有疑問了,Android系統有自己的垃圾回收機制,可以不定期的回收掉不使用的內存空間,當然也包括Bitmap的空間。那為什麼還需要這個方法呢? Bitmap類的構造方法都是私有的,所以開發者不能直接new出一個Bitmap對象,只能通過BitmapFactory類的各種靜態方法來實例化一個Bitmap。仔細查看BitmapFactory的源代碼可以看到,生成Bitmap對象最終都是通過JNI調用方式實現的。所以,載入Bitmap到內存里以後,是包含兩部分內存區域的。簡單的說,一部分是Java部分的,一部分是C部分的。這個Bitmap對象是由Java部分分配的,不用的時候系統就會自動回收了,但是那個對應的C可用的內存區域,虛擬機是不能直接回收的,這個只能調用底層的功能釋放。所以需要調用recycle()方法來釋放C部分的內存。從Bitmap類的源代碼也可以看到,recycle()方法里也的確是調用了JNI方法了的。 那如果不調用recycle(),是否就一定存在內存泄露呢?也不是的。Android的每個應用都運行在獨立的進程里,有著獨立的內存,如果整個進程被應用本身或者系統殺死了,內存也就都被釋放掉了,當然也包括C部分的內存。 Android對於進程的管理是非常復雜的。簡單的說,Android系統的進程分為幾個級別,系統會在內存不足的情況下殺死一些低優先順序的進程,以提供給其它進程充足的內存空間。在實際項目開發過程中,有的開發者會在退出程序的時候使用Process.killProcess(Process.myPid())的方式將自己的進程殺死,但是有的應用僅僅會使用調用Activity.finish()方法的方式關閉掉所有的Activity。 經驗分享: Android手機的用戶,根據習慣不同,可能會有兩種方式退出整個應用程序:一種是按Home鍵直接退到桌面;另一種是從應用程序的退出按鈕或者按Back鍵退出程序。那麼從系統的角度來說,這兩種方式有什麼區別呢?按Home鍵,應用程序並沒有被關閉,而是成為了後台應用程序。按Back鍵,一般來說,應用程序關閉了,但是進程並沒有被殺死,而是成為了空進程(程序本身對退出做了特殊處理的不考慮在內)。 Android系統已經做了大量進程管理的工作,這些已經可以滿足用戶的需求。個人建議,應用程序在退出應用的時候不需要手動殺死自己所在的進程。對於應用程序本身的進程管理,交給Android系統來處理就可以了。應用程序需要做的,是盡量做好程序本身的內存管理工作。 一般來說,如果能夠獲得Bitmap對象的引用,就需要及時的調用Bitmap的recycle()方法來釋放Bitmap佔用的內存空間,而不要等Android系統來進行釋放。 下面是釋放Bitmap的示例代碼片段。 // 先判斷是否已經回收 if(bitmap != null && !bitmap.isRecycled()){ // 回收並且置為null bitmap.recycle(); bitmap = null; } System.gc(); 從上面的代碼可以看到,bitmap.recycle()方法用於回收該Bitmap所佔用的內存,接著將bitmap置空,最後使用System.gc()調用一下系統的垃圾回收器進行回收,可以通知垃圾回收器盡快進行回收。這里需要注意的是,調用System.gc()並不能保證立即開始進行回收過程,而只是為了加快回收的到來。 如何調用recycle()方法進行回收已經了解了,那什麼時候釋放Bitmap的內存比較合適呢?一般來說,如果代碼已經不再需要使用Bitmap對象了,就可以釋放了。釋放內存以後,就不能再使用該Bitmap對象了,如果再次使用,就會拋出異常。所以一定要保證不再使用的時候釋放。比如,如果是在某個Activity中使用Bitmap,就可以在Activity的onStop()或者onDestroy()方法中進行回收。 2) 捕獲異常 因為Bitmap是吃內存大戶,為了避免應用在分配Bitmap內存的時候出現OutOfMemory異常以後Crash掉,需要特別注意實例化Bitmap部分的代碼。通常,在實例化Bitmap的代碼中,一定要對OutOfMemory異常進行捕獲。 以下是代碼示例。 Bitmap bitmap = null; try { // 實例化Bitmap bitmap = BitmapFactory.decodeFile(path); } catch (OutOfMemoryError e) { // } if (bitmap == null) { // 如果實例化失敗 返回默認的Bitmap對象 return defaultBitmapMap; } 這里對初始化Bitmap對象過程中可能發生的OutOfMemory異常進行了捕獲。如果發生了OutOfMemory異常,應用不會崩潰,而是得到了一個默認的Bitmap圖。 經驗分享: 很多開發者會習慣性的在代碼中直接捕獲Exception。但是對於OutOfMemoryError來說,這樣做是捕獲不到的。因為OutOfMemoryError是一種Error,而不是Exception。在此僅僅做一下提醒,避免寫錯代碼而捕獲不到OutOfMemoryError。 3) 緩存通用的Bitmap對象 有時候,可能需要在一個Activity里多次用到同一張圖片。比如一個Activity會展示一些用戶的頭像列表,而如果用戶沒有設置頭像的話,則會顯示一個默認頭像,而這個頭像是位於應用程序本身的資源文件中的。 如果有類似上面的場景,就可以對同一Bitmap進行緩存。如果不進行緩存,盡管看到的是同一張圖片文件,但是使用BitmapFactory類的方法來實例化出來的Bitmap,是不同的Bitmap對象。緩存可以避免新建多個Bitmap對象,避免內存的浪費。 經驗分享: Web開發者對於緩存技術是很熟悉的。其實在Android應用開發過程中,也會經常使用緩存的技術。這里所說的緩存有兩個級別,一個是硬碟緩存,一個是內存緩存。比如說,在開發網路應用過程中,可以將一些從網路上獲取的數據保存到SD卡中,下次直接從SD卡讀取,而不從網路中讀取,從而節省網路流量。這種方式就是硬碟緩存。再比如,應用程序經常會使用同一對象,也可以放到內存中緩存起來,需要的時候直接從內存中讀取。這種方式就是內存緩存。 4) 壓縮圖片 如果圖片像素過大,使用BitmapFactory類的方法實例化Bitmap的過程中,需要大於8M的內存空間,就必定會發生OutOfMemory異常。這個時候該如何處理呢?如果有這種情況,則可以將圖片縮小,以減少載入圖片過程中的內存的使用,避免異常發生。 使用BitmapFactory.Options設置inSampleSize就可以縮小圖片。屬性值inSampleSize表示縮略圖大小為原始圖片大小的幾分之一。即如果這個值為2,則取出的縮略圖的寬和高都是原始圖片的1/2,圖片的大小就為原始大小的1/4。 如果知道圖片的像素過大,就可以對其進行縮小。那麼如何才知道圖片過大呢? 使用BitmapFactory.Options設置inJustDecodeBounds為true後,再使用decodeFile()等方法,並不會真正的分配空間,即解碼出來的Bitmap為null,但是可計算出原始圖片的寬度和高度,即options.outWidth和options.outHeight。通過這兩個值,就可以知道圖片是否過大了。 BitmapFactory.Options opts = new BitmapFactory.Options(); // 設置inJustDecodeBounds為true opts.inJustDecodeBounds = true; // 使用decodeFile方法得到圖片的寬和高 BitmapFactory.decodeFile(path, opts); // 列印出圖片的寬和高 Log.d("example", opts.outWidth + "," + opts.outHeight); 在實際項目中,可以利用上面的代碼,先獲取圖片真實的寬度和高度,然後判斷是否需要跑縮小。如果不需要縮小,設置inSampleSize的值為1。如果需要縮小,則動態計算並設置inSampleSize的值,對圖片進行縮小。需要注意的是,在下次使用BitmapFactory的decodeFile()等方法實例化Bitmap對象前,別忘記將opts.inJustDecodeBound設置回false。否則獲取的bitmap對象還是null。 經驗分享: 如果程序的圖片的來源都是程序包中的資源,或者是自己伺服器上的圖片,圖片的大小是開發者可以調整的,那麼一般來說,就只需要注意使用的圖片不要過大,並且注意代碼的質量,及時回收Bitmap對象,就能避免OutOfMemory異常的發生。 如果程序的圖片來自外界,這個時候就特別需要注意OutOfMemory的發生。一個是如果載入的圖片比較大,就需要先縮小;另一個是一定要捕獲異常,避免程序Crash。
❿ 如何根據需要定義堆棧段的大小
堆棧的定義是這樣的:
dssg
segment
stack
aa
dw
512p(?)
dssg
ends
一般的說,當PUSH/POP指令不頻繁時用系統堆棧就可以了,但是當需要堆棧慶物晌存儲大量數據,如作為子程序傳替參數時就要定義一個堆棧,而且一般來說一個段的內容不能超過64K,因為偏移地址最大隻能表螞余示64K,所以定義的堆棧也不能是無限大,如果超過了64K,就定義兩個吧!
堆棧在匯編中對於初學者用的很少,一般小程序都不需要用的!用起來也不是很難,就是注意下,在子程序調用時,什麼時候是返回地址,什麼時候是寄存器值!總之譽鋒,記住先進後出,再做題時畫個堆棧圖,應該不會很難的!