一、Class文件内容
class文件包含java程序所执行的字节码,数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符,文件以0xcafebabe(咖啡宝贝)这个特殊标志作为开头。
文件内容包括:版本、访问标志、常量池、当前类、父类、接口、字段、方法和属性
二、java运行时
java文件(源代码) 经过编译器编译,生成 class文件(字节码),JVM(java虚拟机)加载字节码
三、JVM运行时数据区
共享部分:所有线程都能访问到的内存数据,随虚拟机或者GC创建和销毁;
独占部分:每个线程都有自己的内存空间,随线程的生命周期创建和销毁;
方法区:存储加载的类信息、常量、静态变量、编译后的代码等数据。虚拟机规范说明该区域为逻辑区域,不同的虚拟机的实现方式不同。java7中方法去存放在永久代;java8存放在元数据控件,并且通过GC对这个区域进行管理。
堆内存:在jvm启动时创建,用来存放对象的实例。垃圾回收期主要管理堆内存。如果堆内存空间不足,就会报内存溢出,即OOM(OutOfMemroyError)。堆内存分为新生代(Eden、Form Survivor、To Survivor)、老年代.。
虚拟机栈:每个线程在虚拟机栈中都有一个私有的空间,称为线程栈,而线程栈由多个栈帧(Stack Frame)组成。一个线程需要执行一个或多个方法,一个方法对应一个栈帧。栈帧包括局部变量表、操作数栈、动态链接、方法返回地址、附件信息等。虚拟机栈内存默认最大是1M,超过就会抛出StackOverflowError(栈溢出)。
本地方法栈:与虚拟机栈不同的是本地方法栈是为虚拟机使用Native本地方法而准备的。虚拟机规范中没有规定具体的实现,由不同的虚拟机厂商实现。
程序计数器:用于记录线程执行字节码的位置,保存的是字节码指令的地址;如果是Native方法,则计数器为空。每个线程在程序计数器中都有一个私有的空间,占用内存空间很小。JVM多线程会轮流切换并分配CPU执行的时间,为了线程切换后,通过程序计数器,恢复到正确的执行位置。
java指令:
编译 javac 例:javac Demo.java
查看内容:javap 例:javap -v Demo.class > Demo.txt
分享给有需要的人,1个积分,收集资源不易。