摘要:
垃圾回收(GC) 需要做三件事情: 哪些内存可以回收? 什么时候可以回收? 如何回收? Java 是通过根搜索法判定对象是否存活的。 基本思路:以“GC roots”的对象为起点。从这些节点开始向下搜索,搜索路过的路径成为“引用链” 当GC roots 没有任何引用链相连时,便可回收此对象。 可以作为GC roots 的对... 阅读全文
摘要:
JAVA 堆溢出 例子: VM options 设置为:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError package com.panpan.web.controller;import java.util.ArrayList;import java.util.List;/** * 内存溢出 * Created with Intel... 阅读全文
摘要:
如下一句代码:Object obj = new Object();可以用一图表明:对象的引用放到了栈 里,对象的实例存储在堆里。引用类型只规定了一个指向对象的引用。那它是如何通过这个引用找到在java堆中对象的实例呢?不同的虚拟机有不同的方式。主流的有两种:使用句柄在java堆中开辟了一块内存作为句柄池。reference 类型存储的是对象的句柄地址,句柄中包含了对象实例的指针。直接使用指针可以看到的是reference 中直接就存储了对象的地址。各自的优势比较: 一、句柄方式最大的好处就是在对象改变位置的时候(这种情况在垃圾回收时是常有的),reference的句柄地址不需要改变。只会更改句 阅读全文
摘要:
Java 在执行的过程中,会把它所管理的内存瓜分成不同的区域。程序计数器 当前线程执行字节码的行号指示器。所占内存小,是唯一一个java虚拟机中不会出现OutOfMemoryError 情况的区域。JAVA虚拟机栈 每个方法在执行的时候同时也会创建一个栈帧。用于操作局部变量表、操作栈、动态链接、方法出口等信息。 局部变量表:基本的数据类型(boolean、byte 、char 等),对象的引用。 两种情况会出现异常状况: 线程请求的栈深度 大于 虚拟机所允许的深度,将抛出StackOverflowError 异常; 如果线程请求可以动态扩展,当扩展无法申请到足够的内存时将抛出 OutOfMem 阅读全文