1、运行时数据区域:包括方法区,虚拟机栈,堆,本地方法栈,程序计数器。
2、程序计数器(Program Counter Register):是一块较小的内存空间,他可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
3、如果正在执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码的地址,如果正在执行的是native方法,这个技术器为空,native方法不会OOM。
4、虚拟机栈是线程私有的,我们口中的栈,其实就是虚拟机栈部分。
5、堆:是被所有线程共享的一块区域,在虚拟机启动时被创建,唯一作用就是创建对象实例。
6、方法区:是各个线程共享的内存区域,用于存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
7、Java程序需要通过栈上的refrence数据来操作堆上的具体对象,主流的从本地变量表去寻找对象的方式有两种,第一种句柄池访问:在Java堆中划分出一片内存来作为句柄池,refrence中存储着对象的句柄地址,如果对象经常被移动的话(因为垃圾回收),这种方法会更有优势。第二种:直接指针访问,refrence中中存储的就是对象的地址,这种方式更快,这本书讨论的虚拟机Sun HotSpot就是采用了直接指针访问。
8、
如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
如果虚拟机在扩展栈时无法申请到足够的空间,则抛出OutOfMemoryError异常。
9、String.intern()方法的作用是:如果常量池中已经包含一个等于String对象的字符串,则返回代表池中这个字符串的对象,否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。
10、cglib动态生成字节码、jsp编译(因为要转化为Servlet)、不同的类加载器加载同一类这几种情况都会造成永久代OOM。