熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JVM運行時內存空間結構

2013-11-23 18:50:42  來源: Java核心技術 

  JVM執行Java程序的過程中管理的內存空間包括下列幾個區域

  程序計數器(Program CounterRegister)

  ·        線程私有占用空間很小

  ·        線程所執行代碼行號指示器

  ·        解釋器通過計數器的值選擇下一條執行的字節碼指令

  ·        線程執行Native方法時值為空

  ·        沒有OOM(OutOfMemory)Java虛擬機棧(Java Virtual Machine Stacks)

  ·        線程私有·        儲存方法棧幀(Stack Frame)

  ·        棧幀儲存局部變量表操作棧動態鏈接方法出口等

  ·        局部變量表編譯器可知的基本類型對象引用和returnAddress(字節碼指令的地址)在編譯期間完成分配運行時大小不變

  ·        存在StackOverflowError和OOM

  ·        StackOverflowError線程請求棧深度大於VM允許深度

  ·        OOM創建線程或擴展線程空間時無足夠內存

  StackOverflowError例子

  /**

  * Xssk

  *

  * @author Alfred Xu <>

  *

  */

  public class StackSOF {

  int recursionLength;

  void recusion() {

  recursionLength++;

  recusion();

  }

  public static void main(String[] args) {

  StackSOF sof = new StackSOF();

  try {

  sofrecusion();

  } catch (Throwable e) {

  Systemoutprintln(sofrecursionLength);

  eprintStackTrace();

  }

  }

  }

  OOM例子

  /**

  * Xssm

  *

  * @author Alfred Xu <>

  *

  */

  public class StackOOM {

  static class Tester extends Thread {

  @Override

  public void run() {

  try {

  Threadsleep( * );

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  }

  public static void main(String[] args) {

  for (int i = ;; i++) {

  new Tester()start();

  Systemoutprintln(i);

  }

  }

  }

  本地方法棧(Native MethodStacks)

  ·        線程私有類似虛擬機棧

  ·        服務Native方法

  ·        同樣存在StackOverflowError和OOM

  ·        Hotspot中將Java虛擬機棧和本地方法棧合二為一通過Xss設置大小JDK以前默認K默認M

  Java堆(Java Heap)

  ·        所有線程共享

  ·        儲存對象實例

  ·        GC和OOM的主要區域

  Heap OOM例子

  /**

  * Xmsm Xmxm

  *

  * @author Alfred Xu <>

  *

  */

  public class HeapOOM {

  public static void main(String[] args) {

  List<Long> list = new ArrayList<Long>();

  for (long i = ;; i++) {

  listadd(i);

  Systemoutprintln(i);

  }

  }

  }

  方法區(Method Area)

  ·        又叫非堆(NonHeap)對應HotSpot的永久代(Permanent Generation)

  ·        所有線程共享

  ·        儲存VM加載的類信息常量靜態變量JIT編譯代碼等

  ·        也有OOM一般是由於大量使用反射生成class

  ·        包含運行時常量池(Rumtime ConstantPool)

  常量池溢出例子

  /**

  * XX:MaxPermSize=m

  *

  * @author Alfred Xu <>

  *

  */

  public class ConstantPoolOOM {

  public static void main(String[] args) {

  List<String> list = new ArrayList<String>();

  for (int i = ;; i++) {

  listadd(StringvalueOf(i)intern());

  Systemoutprintln(i);

  }

  }

  }

  本機直接內存(Direct Memory)

  ·        不受VM直接管理但也有OOM

  ·        和NIO中的DirectByteBuffer相關

  ·        默認和Java堆大小一致

  例子

  /**

  * XX:MaxDirectMemorySize=m

  *

  * @author Alfred Xu <>

  *

  */

  @SuppressWarnings(restriction)

  public class DirectMemoryOOM {

  static final int _MB = * ;

  static void unsafeAllocate() throws IllegalArgumentException

  IllegalAccessException {

  Field unsafeField = UnsafeclassgetDeclaredFields()[];

  unsafeFieldsetAccessible(true);

  Unsafe unsafe = (Unsafe) unsafeFieldget(null);

  List<Long> list = new ArrayList<Long>();

  for (int i = ;; i++) {

  long l = unsafeallocateMemory(_MB);

  listadd(l);

  Systemoutprintln(i);

  }

  }

  static void byteBufferAllocate(boolean direct) {

  List<ByteBuffer> list = new ArrayList<ByteBuffer>();

  for (int i = ;; i++) {

  ByteBuffer bb;

  if (direct) {

  bb = ByteBufferallocateDirect(_MB);

  } else {

  bb = ByteBufferallocate(_MB);

  }

  listadd(bb);

  Systemoutprintln(i);

  }

  }

  public static void main(String[] args) throws IllegalArgumentException

  IllegalAccessException {

  byteBufferAllocate(true);

  // unsafeAllocate();

  }

  }

  Hotspot Java內存空間結構

  新生代(Young Generation)

  大部分的對象的內存分配和回收在這裡完成

  Eden

  新建的對象分配在此minor GC後被清空

  Survivor

  存儲至少經過一次GC存活下來的對象以增大該對象在提升至老生代前被回收的機會

  From Space

  在minor GC後被清空GC後存活的對象放入老生代

  To Space

  Eden中在新生代GC後存活的對象放在此

  老生代(Old Generation)

  多次GC後存活的對象或者新生代放置不下的大對象

  永生代(PermanentGeneration)

  方法區


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25843.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.