java源代码(.java)通过编译器编译为字节码文件(.class),然后由JVM的类加载器加载各个类的字节码文件,加载完毕后,交给JVM执行引擎执行。整个执行的过程中JVM会用一段空间来存储执行期间用到的数据及相关信息,这段空间称为运行时数据区(Running Data Area),也就是常说的JVM内存。java中的内存管理就是这段空间进行管理(如何分配和回收内存)。
类加载器:启动类加载器(Bootstrap c++ )、扩展类加载器(Extension java)、应用程序加载器(AppClassLoader)、
自定义类加载器(java.lang.ClassLoader子类)
双亲委派 沙箱安全机制:防止对java源jar中的类进行修改,自己处理不了,交给父亲,父亲处理不了交给父亲的父亲。
java内存:
程序计数器:占内存较小,线程私有,生命周期与线程相同 (指示器)分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成
虚拟机栈:线程私有,生命周期与线程相同,连续的内存空间 StackOverflowError
java堆:线程共享,生命周期与虚拟机相同,可以不使用连续内存地址 保存对象实体,包括数组都要在堆上分配。包含:伊甸区(新生代),幸存区1,幸存区2,老年代,永久代(jkd8后元空间);新产生的对象存放在伊甸区中,程序执行完毕,就会回收内存,清除新生代,幸存下来的进入幸存区,超过15没有被清除就会放到老年代,永久代吗,是存放jdk中的自带的java环境自带的类,以前是存放在内存中,而1.8之后存放在本地中(称为元空间),减少内存占用。
方法区: 线程共享,生命周期与虚拟机相同,可以不使用连续内存地址,存储虚拟机加载的类信息、常量、静态变量、即时编译后的代码等
运行时常量池:方法区的一部分 存放字面量及符号引用