对象的访问定位:
建立对象是为了能够是使用对象;通过栈上的reference数据来操作堆上的具体的对象。然而Reference类型在虚拟机的规范只是指定了一个对象的引用,具体如何去访问,就的需要取决于虚拟机。主要的俩中方式:句柄和直接指针俩种。
句柄式访问:JAVA堆中会划分出一个句柄池,Reference存储的是句柄地址。句柄中包含了对象实例数据与类型数据各自的具体的地址信息。
好处:Reference中存储的是稳定的句柄地址,在对象被移动后,只会改变句柄中的实例数据指针。Reference本身布需要修改。
直接访问:Reference存储的直接就是对象地址。好处:访问的速度极快,节约了一次指针定位的时间开销。
-Xms ,Xmx:最小值参数,最大值参数设置避免堆自动扩展
-XX:+HeapDumpOnOutOfMemeoryError:配置参数可以让虚拟机在出现内存溢出异常的时候Dump出当前的内存堆转存储快照以便事后进行分析。
-Xss:设置栈容量
-XX:PermSize -XX:MaxPermSize:可以限制方法区的大小,从而间接的限制常量池的容量大小。
DirectMemory容量可以用:-XX:MaxDirectMemorySize设定
回顾JAVA虚拟机的分区:
运行时数据区:
程序计数器:
JAVA虚拟机栈:各种基本数据类型,对象引用和returnAddress类型
本地方法栈:作用和JAVA虚拟机栈一样,主要区别:虚拟机栈实行JAVA方法(字节码)服务,然而本地方法栈使用到的Native方法服务
(有的虚拟机合并了虚拟机栈和本地方法栈)
JAVA堆:垃圾收集器主要管理的区域,用于存放对象实例。
方法区:线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量,即时编译器编译后的代码等数据。
运行时常量池:是方法区的一部分,用于存放编译期生成的各种自面量和符号引用
直接内存: