JVM自学指南已经整理到我的GitHub开源项目: [JVM自学指南]
加载类元信息 -》 为对象分配内存 -》处理并发问题 -》属性的默认初始化 -》设置对象头 -》init方法
说明:如果是数组,还需记录数组的长度
它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段) 规则:
不是必须的,也没特别含义,仅仅起到占位符作用
public class CustomerTest {
public static void main(String[] args) {
Customer cust = new Customer();
}
}
JVM是如何通过栈帧中的对象引|用访问到其内部的对象实例的呢?-> 定位,通过栈上reference访问
/**
* IO NIO (New IO / Non-Blocking IO)
* byte[] / char[] Buffer
* Stream Channel
*
* 查看直接内存的占用与释放
*/
public class BufferTest {
private static final int BUFFER = 1024 * 1024 * 1024;//1GB
public static void main(String[] args){
//直接分配本地内存空间
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);
System.out.println("直接内存分配完毕,请求指示!");
Scanner scanner = new Scanner(System.in);
scanner.next();
System.out.println("直接内存开始释放!");
byteBuffer = null;
System.gc();
scanner.next();
}
}
也可能导致OutOfMemoryError异常:OutOfMemoryError: Direct buffer memory 由于直接内存在Java堆外,因此它的大小不会直接受限于一Xmx指定的最大 堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。
直接内存大小可以通过MaxDirectMemorySize设置 如果不指定,默认与堆的最大值一Xmx参数值一致 java 进程占用内存= java堆 + 本地直接内存