日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 内存模型堆和本地方法

發布時間:2025/1/21 编程问答 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 内存模型堆和本地方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 一、java內存模型堆
      • 1、堆特點
      • 2、堆異常
      • 3、堆的性能調優參數
    • 二、本地方方法

一、java內存模型堆

1、堆特點

堆是用于存放對象的內存區域。因此,它是垃圾收集器(GC)管理的主要目標。

  • 堆在邏輯上劃分為“新生代”和“老年代”,在細致一點可分為Eden空間、From Survivor空間、To Survivor。由于JAVA中的對象大部分是朝生夕滅,還有一小部分能夠長期的駐留在內存中,為了對這兩種對象進行最有效的回收,將堆劃分為新生代和老年代,并且執行不同的回收策略。不同的垃圾收集器對這2個邏輯區域的回收機制不盡相同。這塊以后會細講。
  • 內存的分配角度看,線程共享的java堆可能劃分出多個線程私有的分配緩沖區。
  • 堆一般實現成可擴展內存大小,使用“-Xms”與“-Xmx”控制堆的最小與最大內存,擴展動作交由虛擬機執行。但由于該行為比較消耗性能,因此一般將堆的最大最小內存設為相等。
  • 堆占用的內存并不要求物理連續,只需要邏輯連續即可。
  • 堆的生命周期是隨著虛擬機的啟動而創建。
  • 堆是所有線程共享的內存區域,因此每個線程都可以拿到堆上的同一個對象。

2、堆異常

當堆無法分配對象內存且無法再擴展時,會拋出OutOfMemoryError異常。

package com.sl.common;import java.util.ArrayList; import java.util.List;/*** @author shuliangzhao* @Title: Test* @ProjectName spring-boot-learn* @Description: TODO* @date 2019/9/24 19:41*/ public class Test {public static void main(String[] args) {List<Object> list = new ArrayList<>();while (true) {list.add(new Test());}} }

上述代碼中對象不斷的被創建而不進行引用釋放,導致GC無法回收堆內存,最終OutOfMemoryError。

3、堆的性能調優參數

  • -Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize):指定JVM的初始和最大堆內存大小,兩值可以設置相同,以避免每次垃圾回收完成后JVM重新分配內存。
  • Xmn:設置年輕代大小。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。所以增大年輕代后,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
  • -Xss:設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
  • -XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath:讓JVM在發生內存溢出時自動的生成堆內存快照(堆內存快照文件有可能很龐大,推薦將堆內存快照生成路徑指定到一個擁有足夠磁盤空間的地方。)
  • -XX:PermSize and -XX:MaxPermSize:設置永久代大小的初始值和最大值(默認:最小值為物理內存的1/64,最大值為物理內存的1/16,永久代在堆內存中是一塊獨立的區域,這里設置的永久代大小并不會被包括在使用參數-XX:MaxHeapSize 設置的堆內存大小中)
  • -XX:PretenureSizeThreshold :令大于這個設置值的對象直接在老年代分配。這樣做的目的是避免在Eden區及兩個Survivor區之間發生大量的內存復制

二、本地方方法

本地方法棧的功能和特點類似于虛擬機棧,均具有線程隔離的特點以及都能拋出StackOverflowError和OutOfMemoryError異常。不同的是,本地方法棧服務的對象是JVM執行的native方法,而虛擬機棧服務的是JVM執行的java方法。如何去服務native方法?native方法使用什么語言實現?怎么組織像棧幀這種為了服務方法的數據結構?虛擬機規范并未給出強制規定,因此不同的虛擬機實可以進行自由實現,我們常用的HotSpot虛擬機選擇合并了虛擬機棧和本地方法棧。

總結

以上是生活随笔為你收集整理的java 内存模型堆和本地方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。