自动内存管理机制
1 虚拟机栈:存放某个函数方法中得局部变量,为虚拟机执行java方法服务。为线程私有的内存
2 本地方法栈:栈,为调用native方法的服务。
3 java堆:存放所有得对象实例,java虚拟机器所管理得内存中最大得一块。java堆被所有线程共享。垃圾回收管理的主要区域。
4 方法区:存放已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。常被hotspot作为永久代处理
5 运行时常量池:方法区的一部分。存放编译时生产的各种字面值和符号引用。
6 直接内存:jdk使用native函数库直接分配的对外内存,在java堆中分配的对应操作这块区域的引用的区域,叫做直接内存。
7:内存溢出设定
-Xms:20M 设定堆内存大小
-XX:Persize=15M -XX:MaxPermSize=256M 方法区内存大小
-XX:MaxDirectMemorySize=10M 直接内存大小
8:虚拟机对象
对象创建:正确划分可用空间,保障划分空间的原子性(CAS、TLAB)
对象内存布局:对象头、实例对象、对齐补充。
对象的访问:通过栈上的reference数据来操作堆上的对象。
分为两种方式:
通过句柄
通过直接指针:
9 OutOfMemeroy
java堆:-XX调节堆大小
内存泄露:有GC Roots的引用路径。则,根据引用链路确定对应的泄露代码位置。
内存溢出:没有到GC Roots的引用链路。则,需要检查对应的对参数是否合适。-Xmx与-Xms
栈:-Xss调节栈大小
StackOutOfMemory异常:栈深度溢出。
OutOfMemeryError:栈空间不足溢出
方法区:-XX:PermSiz -XX:MaxPerSzie 设置方法区值和最大值。
OutOfMemory:PermGen space 方法区(老年代)溢出
直接内存区 -XX:MaxDirectMemorySize指定直接内存。