jvm学习第一天

 与c和c++不同,java的虚拟机拥有自动垃圾回收的机制,使得程序员不必去关注垃圾回收的具体过程,然而或许也正因为如此,一旦出现了java内存泄露或者内存溢出时,排查工作讲变的麻烦,所以,理解jvm还是很有意义的。

 

一、jvm运行时数据区域:分为方法区,栈(本地方法栈、虚拟机栈),程序计数器,堆。

 

程序计数器:由于cpu处理线程时采用的是轮询的方式,所以,计数器会帮助cpu完成下一个线程的调度工作,当然每个线程都有一个独立的程序计数器,以便cpu能够找到相应的线程。

 

栈:jvm中的栈分为虚拟机栈和本地方法栈,在程序运行的过程中,会产生很多局部变量,也就是很多基本类型和对象的引用。当栈的引用深度超过虚拟机允许的深度,就会抛出StackOverflowError,而当虚拟机扩展内存超出事先规定的内存时,会抛出OutOfMemoryError。

 

堆:所有线程共享的一篇内存区域,保存对象的实例,同样当扩展内存越界时会抛出OutOfMemoryError。

 

方法区:一般称为非堆,为了把它和堆区分开,主要包括运行时常量池,保存一些静态常量。

 

二、对象访问

分为两种方式,句柄和直接指针

 

句柄方式中,引用保存的是句柄池中句柄的内存地址,然后根据句柄地址,再去寻找对象实例的地址,优点是当对象实例的地址发生变化时,只需要更改句柄的地址,而引用的地址不用改变。

 

直接指针:保存对象实例的内存地址,优点是减少一次寻址过程。

 

三、垃圾收集器与内存分配策略

GC主要完成三件事情:

1、那些内存需要回收

2、什么时候回收

3、如何回收

你可能感兴趣的:(jvm,学习)