zoukankan      html  css  js  c++  java
  • 《深入理解java虚拟机》读书笔记——java内存区域和内存溢出异常

    几种内存溢出异常:
    堆溢出
    原因:创建过多对象,并且GC Roots到对象之间有可达路径。
    分两种情况:
    Memory Leak:无用的对象没有消除引用,导致无用对象堆积。例如《Effictive java》中提到的用ArrayList实现的stack扩容再收缩,长度之外的对象不会被回收。
    Memory Overflow:内存溢出,创建了太多对象并且这些对象都有用;需要调整-Xmx参数(或优化程序)。
     
    虚拟机栈溢出
    三种情况:
    StackOverflowError:调用栈深度超过最大深度限制。
    OutOfMemoryError:局部变量过多(栈帧大)将可用内存耗尽。
    创建过多线程导致OutOfMemoryError:每个线程分配的工作内存(Working Memory)将可用内存耗尽。
     
    方法区和运行时常量池溢出
    这部分主要提下String.intern()和StringBuilder。String.intern()将实例存到运行时常量池(1.6之前拷贝实例,1.7之后存储引用),可被复用;StringBuilder.toString()始终在堆中创建一个新对象。
     
    对象的内存布局
    对象头、实例数据、对齐填充
     
    对象的访问定位
    java栈中保存的reference数据有两种实现方式:句柄和指针。
    句柄:java堆中有句柄池,reference指向句柄池,句柄池中存储指向实例的指针(堆),和指向类型的指针(方法区)。
    指针:指针直接指向堆中的实例,实例对象头保存类型指针。
     
  • 相关阅读:
    Educational Codeforces Round 74 (Rated for Div. 2)
    Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) 题解
    D
    Card Hand Sorting 二进制枚举暴力
    20172018-acmicpc-southeastern-european-regional-programming-contest-seerc-2017-en A
    Round #590 (Div. 3)
    A
    P2634 [国家集训队]聪聪可可
    HDU-4807-Lunch Time(二分+费用流,思维)
    易错分析
  • 原文地址:https://www.cnblogs.com/night1989/p/9589229.html
Copyright © 2011-2022 走看看