深入理解Java虚拟机纪要(一):java内存区域与内存溢出异常

自动内存管理机制



 

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指定直接内存。

 

 

 

 

猜你喜欢

转载自yuren1hao.iteye.com/blog/2335684
今日推荐