发现自己对jvm中的内容总是忘记。
方法区和堆是线程共享的,
程序计数器,本地方法区,虚拟机栈式线程私有的
就是和我们计算机组成原理中的那一个pc一样,就是记录一下下一条将要执行的是哪一条语句。
分支、跳转、循环、异常处理、线程恢复等基础操作都会依赖这个计数器来完成。
线程私有:
虚拟机栈每一个线程都有一个单独的程序计数器
虚拟机栈就是是方法调用的栈,调用一个方法就会创建一个栈帧(保存参数的个数和类型,返回值等等)让它进栈,调用完毕就出栈并销毁该栈帧。
有一个栈顶的栈针,管控着每一个方法,所以每次就调用栈顶的栈帧,返回的就是栈帧中保存的返回值。每次都一帧一帧的调用,就像是电影的每一帧画面一样
异常:
本地方法区栈当线程请求的范围超出了jvm虚拟机栈的大小之后,就会报StackOverFlowError异常
另外,虚拟机栈的内存大小还可以扩展,如果扩展不成功的话,就会报OutOfMemoryError异常
和虚拟机栈基本是一样的,只不过虚拟机栈是一样调用的外部函数,本地方法区栈式jvm中的内部函数(也叫做native函数,一般是由C或者C++实现).
异常:
堆本地方法区栈也是同样会抛出StackOverFlowError异常和OutOfMemoryError异常
堆是存放实例对象的地方.也是最耗费内存的地点.所有线程的对象全部都放在一起.是线程共享的
一般来说,对象是由垃圾回收机制来自动的进行回收的.
但是只创建但是不销毁的话也会造成堆中空间不够
方法区就是存放被虚拟机加载的类信息,字段信息,方法信息,属性信息,常量,静态变量,常量池等等
我们的反射机制,就是源于此.从方法区获得的属性的信息等等.
这个也是线程共享的.也会由于存入的信息过多而导致OutOfMemoryError异常



