新生代和老年代

什麼是堆:new出來的的對象都會存放在堆當中
堆內存分爲兩個區:(垃圾回收機制)
新生代:Eden,s0,s1
老年代:

剛new出來的對象存放在Eden區域中
新生代:剛創建對象,先存放在新生代
老年代:如果對象頻繁被使用,對象放入老年代
s0,s1大小相同:爲了來及回收機制的複製算法
垃圾回收機制需要經常去老年代進行垃圾回收嗎?
垃圾回收機制主要是對新生代進行垃圾回收。

堆內存參數配置:
-XX:+PrintGC 每次觸發日誌的時候打印相關日誌
-XX:+UseSerialGC 串行回收
-XX:+printGCDetails 打印更詳細的GC日誌
-Xms:堆初始值
-Xmx:堆最大可用值
-Xmn:新生代堆最大可用值
-XX:survivorRatio 用於設置新生代Eden空間和from/to空間比例

配置新生代和老年代的調優參數配置
-XX:survivorRatio = 2 Eden是from區(s0)或者to區(s1)的兩倍
-XX:NewRatio = 2 設置老年區的內存大小爲新生代去的兩倍

總結:在實際應用中,我們可以直接將堆的初始值與堆的最大可用值相等,這樣可以減少程序運行時垃圾回收的次數,從而提高效率

初始值越小,垃圾回收的次數就越多

堆溢出的解決方案:
java.lang.OutOfMemoryError:Java heap space 堆內存溢出

解決辦法:
設置堆內存大小 :
-Xms1m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError(打印內存溢出錯誤信息)

在實際開發中,可以在Tomcat的catalina.sh文件中設置JVM的堆內存大小
JAVA_OPTS="-Server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"

棧溢出:產生於無限遞歸調用,循環遍歷是不會的,但是循環方法裏面產生遞歸調用,也會發生棧溢出。

解決辦法:設置線程最大調用深度
設置 -Xss的大小。例如-Xss5m

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章