1)java
内存分为程序计数器,堆,栈,方法区
程序计数器是
线程私有的,可以看作当前线程所执行的字节码的行号指示器
栈是线程私有的,每个方法创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息
堆是所有线程共享的一块内存区域,唯一目的就是存放对象实例,是垃圾收集器主要管理的区域,java堆可以分为新生代和老年代,新生代可以细分为Eden空间,From Survivor空间,To Survivor空间等
方法区是线程共享的一块内存区域,用来存储已经被虚拟机加载的类信息,静态变量,常量,即使编译器编译后的代码等数据
2)对象访问
如下面代码所示:
Object obj = new Object();
引用obj指向栈,对象new Object()指向堆,存储Object对象所有的实例数据值,还包含能查找到此对象类型数据(如对象类型,父类,实现的
接口,方法等)的地址信息
对象访问方式有两种:使用句柄和直接指针
使用句柄访问方式,java堆中会划分一块内存作为句柄池,引用对象存储的是对象的句柄地址,而句柄包含了对象实例数据和类型数据各自的具体地址信息
使用直接指针访问方式,引用对象指向储存对象实例数据的堆地址,并放置访问类型数据的相关信息
使用句柄最大的好处是移动数据时只需要改变句柄中的实例数据指针,而不用修改引用对象
使用直接指针的好处是速度更快,节省了一次指针定位的时间开销
3)OutOfMemoryError
堆溢出:-XX:+HeapDumpOnOutOfMemoryError,打印内存堆转储快照,使用IBM Analysis工具分析
栈溢出
方法区溢出