Native方法
public class Test {
public static void main(String[] args) {
// java 真的可以开启线程吗?
// private native void start0();
new Thread().start();
}
}
native : 只要是带了这个关键字的,说明 java的作用范围达不到,只能去调用底层 C 语言的库!
JNI : Java Native Interface (Java 本地方法接口)
为什么会有 Native 这个东西?
1995年,java 必须可以去调用 c、c++的库,所以说Java就在内存中专门开辟了一块区域标记为 native 方法
程序计数器
每个线程都有一个程序计数器,是线程私有的。
程序计数器就是一块十分小的内存空间;几乎可以不计
作用: 看做当前字节码执行的行号指示器;
分支、循环、跳转、异常处理!都需要依赖于程序计数器来完成!
bipush
将 int、float、String、常量值推送至栈顶;
istore
将一个数值从操作数栈存储到局部变量表;
iadd
加
imul
乘
方法区渊源
Method Area 方法区 是 Java虚拟机规范中定义的运行是数据区域之一,和堆(heap)一样可以在线程之间共享!
JDK1.7之前
永久代:用于存储一些虚拟机加载类信息,常量,字符串、静态变量等等。。。。这些东西都会放到永久代中;
永久代大小空间是有限的:如果满了 OutOfMemoryError:PermGen
JDK1.8之后
彻底将永久代移除 HotSpot jvm ,Java Heap 中或者 Metaspcace(Native Heap)元空间;
元空间就是方法区在 HotSpot jvm 的实现;
方法区重要就是来存:类信息,常量,字符串、静态变量、符号引用、方法代码。。。。。。
元空间和永久代,都是对JVM规范中方法区的实现。
元空间和永久代最大的区别:==元空间并不在Java虚拟机中,使用的是本地内存!
方法区存储的是每个class的信息:
1.类加载器引用(classLoader)
2.运行时常量池
所有常量、字段引用、方法引用、属性
3.字段数据
每个方法的名字、类型(如类的全路径名、类型或接口) 、修饰符(如public、abstract、final)、属性
4.方法数据
每个方法的名字、返回类型、参数类型(按顺序)、修饰符、属性
5.方法代码
每个方法的字节码、操作数栈大小、局部变量大小、局部变量表、异常表和每个异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引