社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
JVM就是java虚拟机,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
1.类的加载(加载到JVM)
class文件通过类加载器加载到内存。
类加载全过程:加载Class对象---连接(1.验证(安全和规范),2.准备(分配内存),3.解析(将类中的符号引用转换成直接引用))---初始化---使用---卸载
类加载器使用的加载模式:双亲委托机制
类加载器:
BootStrapClassLoader 启动类加载器 负责jre/lib/rt.jar
ExtClassLoader 扩展类加载器 jre/lib/*.jar或-Djava.ext.dirs
AppClassLoader 应用类加载器 记载classpath中指定的jar包及目录中class
UserClassLoader 自定义的类加载器 继承ClassLoader getClass().ClassLoader()可以获得
2.在类加载检查通过后,接下来虚拟机将为新生对象分配内存。
别人家画内存模型, 戳这里 http://www.cnblogs.com/lfs2640666960/p/9297176.html
简单看了一下内存模型,简单看看每个区域究竟存储的是什么(干的是什么):
我来宏观简述一下工作流程:
java.exe
运行Java3yTest.class
,随后被加载到JVM中,方法区(元空间)存储着类的信息(包括类的名称、方法信息、字段信息..)。Java3y java3y = new Java3y();
就是让JVM创建一个Java3y对象,但是这时候方法区中没有Java3y类的信息,所以JVM马上加载Java3y类,把Java3y类的类型信息放到方法区中(元空间)java3y.setName("Java3y");
的时候,JVM根据java3y引用找到Java3y对象,然后根据Java3y对象持有的引用定位到方法区中Java3y类的类型信息的方法表,获得setName()
函数的字节码的地址setName()
函数创建栈帧,开始运行setName()
函数。3.GC
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!