Java程序运行基本原理
Java的跨平台性
java代码通过编译后生成.class文件运行在java虚拟机上,同一个.class文件通过虚拟机会得到不同的机器指令(Windows和Linux的机器指令不同),但是最终执行的结果却是相同的。java虚拟机屏蔽了底层操作系统指令上的差异,从而实现java语言的跨平台性。
.class文件的内容
.class文件包含java程序运行的字节码,是一组以8位字节为基础严格按照规定的格式紧凑排列的二进制流,中间无任何分隔符(如下图);二进制文件不易于阅读,我们可以通过class字节码工具:javap输出易于阅读的字节码内容。
java运行时的数据区
Java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。如下图
线程独占:每个线程都会有它的独立空间,随线程的生命周期而创建和销毁
线程共享:所有线程都能访问的内存数据,随虚拟机或者GC而创建和销毁
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,它是一块各个线程共享的内存区域。
堆内存:是JVM所管理的内存中最大的一块,在虚拟机启动时创建,用于存储对象实例,也是线程共享区域。堆内存还可以细分为:老年代、新生代(Eden、From Survivor、To Survivor),垃圾回收器GC主要管理的就是堆内存空间。如果满了就会触发OOM。
虚拟机栈:虚拟机栈是线程独占的,它的生命周期与线程相同,默认栈内存大小是1M。
线程栈会由多个栈帧组成。
栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用到执行完成的过程,对应的就是一个栈帧在虚拟机栈中入栈到出栈的过程。
一个线程会执行一个或多个方法,每个方法会对应一个栈帧。
本地方