凡是带了native关键字的,说明Java的作用范围的达不到了,需要调用底层C语言的库
调用native方法,会进入本地方法栈,调用本地接口(JNI)
JNI的作用:扩展Java的使用,融合不同的编程语言为Java所用
它在内存区域中专门开辟了一块标记区域:Native Method Stack(本地方法栈),登记native方法
在最终执行的时候,加载本地方法库中的方法通过JNI
调用其他接口:Socket、WebService、http
程序计数器:Program Counter Register
每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的字节码,(用来存储指向一条指令的地址,也即将要执行的指令代码),在执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计。
Method Area
方法去是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义的方法的信息都保存在该区域,此区域属于共享空间;
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关
栈内存,主管程序的运行,生命周期和线程同步;
线程结束,栈内存也就释放了,对于栈来说,不存在垃圾回收问题。
栈中存放:8大基本类型+对象引用+实例的方法
栈运行原理:栈帧
栈满了:StackOverflowError
栈+堆+方法区:交互关系
HotSpotJRockitJ9VMHeap,一个JVM只有一个堆内存,堆内存的大小是可以调节的。
类加载器读取了类文件后,一般会把什么东西放到堆中:类实例,方法,常量,变量。 保存我们所有引用类型的真实对象
堆内存中还要细分为三个区域:
假设内存满了,则会爆出OOM,堆内存不够 java.lang.OutOfMemoryError:java heap space
在JDK8以后,永久存储区改了个名字 ---------------- 元空间;
-XX:MaxTenuringThreshold=9999(如何设置VM option 看堆内存调优)设置一个对象需要经历9999次GC才能进入老年区这个区域常驻内存的,用来存放JDK自身携带的Class对象,Inteface元数据,总的来说,存储的是Java运行时的一些环境或类信息,这个区域不存在垃圾回收。关闭虚拟机就会释放这个区域的内存
方法区,常量池在永久区里
一个启动类,加载了大量的第三方jar包、tomact部署了太多的应用、大量动态生成的反射类,不断地被加载,直到内存满,就会出现OOM;
去永久代,常量池在堆;
元空间:逻辑上存在,物理上不存在