一、JVM引入
1.1 java代码执行流程
1.2 JDK体系结构
JDK(Java Development ToolKit),包含了Java运行环境(JRE)和开发工具(编译器,调试器,javadoc等)。我们就是依靠JDK来开发和运行Java程序的。
- JDK的编译器Javac,会将Java代码编译成字节码(.class文件)。编译出的字节码在任何平台上都一样的内容,所以我们说Java语言是门跨平台语言。
- JRE(Java Runtime Environment) ,它为Java提供了运行环境,其中重要的一环就是通过JVM将字节码解释成可执行的机器码。机器码和平台相关的(不同硬件环境、不同操作系统,产生的机器码不同),所以JVM在不同平台有不同的实现。
- JRE由JVM、Java运行时类库、动态链接库等组成。
windows环境安装JDK时,可能装有2个JRE,注意程序运行使用的是哪个JRE
C:\Program Files\Java\jdk1.8.0\jre
C:\Program Files\Java\jre8
二、JVM体系结构
- 方法区、堆是多个线程共享的,存在垃圾回收、OOM;
- 每个线程都有自己独立的栈、程序计数器、本地方法栈;
- 栈、本地方法栈无垃圾回收,可能有OOM(如果线程请求的栈帧深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常);
- 程序计数器无垃圾回收、无OOM。
- 方法区:方法区在jdk1.8之前称为永久代,jdk1.8及之后变为元空间【元空间也变为使用本地内存(直接内存),不再使用jvm内存(直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用)】。
- 方法区:方法区可以理解为-->编译后的代码,被加载到内存后的存储区。
2.1 JVM体系结构明细图
三、JVM内存分配默认值
1、堆内存:默认初始大小为物理内存的1/64,默认最大为物理内存1/4
2、年轻代和老年代默认的比例是1:2。(即分配给年轻代的最大空间量是堆总大小的三分之一)
3、伊甸园和survivor的默认比例是8:1:1
如上各数据是默认值,都可以通过参数进行修改