开启并发编程
1. Java文件是怎么被JVM运行的
一个 .java 源代码通过编译器 编译之后变成一个**.class**字节码文件,jvm启动加载字节码文件,会在内存中大致划分两大区域 :
- 线程共享区域:是所有的线程都能访问的这块内存数据,随虚拟机或者GC(垃圾回收器)创建和销毁
- 线程独占区域:每个线程独立的空间,随线程声明周期而创建销毁
线程共享的区域分为:方法区、堆内存
线程独占区域分为:虚拟机栈、本地方法栈、程序计数器
这里在细说下:
- 方法区
存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等 - Java 堆
在Java虚拟机启动时候建立Java堆,几乎所有的对象实例都存放到Java堆中。堆内存还细分为新生代、老年代、永久代。GC主要的工作就是管理堆内存。 - 虚拟机栈
每个虚拟机线程都会在这个空间有个私有的栈,线程栈是由多个栈桢组成。
一个线程Java栈在线程创建的时候被创建,Java栈中保存局部变量、方法参数。同时Java的方法调用返回值等。
栈最大内存是1M,超出抛异常StackOverflowError - 本地方法栈
本地方法栈和Java栈非常相似,最大不同为本地方法栈用于本地方法调用,Java虚拟机允许Java直接调用本地方法 - 程序计数器
记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法则计数器值为空。每个线程在这个空间中也有个独立的空间,占用内存很小。CPU同一时间只会执行一条线程的中指令。JVM会轮流切换并分配CPU执行,计数器就是为了记录CPU切换会当前线程时提示上次执行的位置。
2. JAVAP 查看class文件
2.1 什么是class文件
上面说了一对JVM加载class文件进行的操作,似乎class文件里面包含了很多东西。其实class文件就是包含了JAVA程序执行的字节码。它的文件开头有一个0xcafebabe(16进制)特殊标识。class文件的查看需要我们借助JDK提供的工具查看。
在说明下,在我们平常开发中使用IDE编辑后class文件是经过IDE解析class之后整理出来给我们看到的格式,并不是class原本的面貌(class就是一个二进制流,中间无任何分隔符)。
2.2 Javap命令直接 查看class文件
首先我们编写一个简单的Java文件
public class DemoOne {
public static void main(String[] args){
int a = 1;
int b = 1;
System.out.println(a + b);
}
}
这里只是简单定义了两个参数a、b 然后输出两者之后,代码简单,运行下main方法,经过编译器编译之后,产生**.class**文件。找到class 文件目录,通过命令行输入命令 javap -v class名称:
这里只是掩饰怎么查看就不截全部图片了
2.3 IDEA 查看class文件
作为一个优秀的java开发工具,idea提供了一个更简单的查看方式:
- 打开Settings->Tools->External Tools -> +
- 如图
- 运行 如图:
3.说明
关于汇编语言指令码、和javap中对应指令码,以及javap中指令码含义这里就不细说了。
最后提供详细说明的链接地址