jvm
JVM就是java虚拟机,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
1.类的加载(加载到JVM)
class文件通过类加载器加载到内存。
类加载全过程:加载Class对象---连接(1.验证(安全和规范),2.准备(分配内存),3.解析(将类中的符号引用转换成直接引用))---初始化---使用---卸载
类加载器使用的加载模式:双亲委托机制
- 1、当APPClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。
- 2、当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。
- 3、如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载;
- 4、若ExtClassLoader也加载失败,则会使用AppClassLoader来加载
- 5、如果AppClassLoader也加载失败,则会报出异常ClassnotfoundException
类加载器:
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方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息
- 本地方法栈:本地方法栈则是为虚拟机使用到的Native方法服务。
- 方法区:存储已被虚拟机加载的类元数据信息(元空间)
- 程序计数器:当前线程所执行的字节码的行号指示器
我来宏观简述一下工作流程:
- 1、通过
java.exe
运行Java3yTest.class
,随后被加载到JVM中,方法区(元空间)存储着类的信息(包括类的名称、方法信息、字段信息..)。 - 2、然后JVM找到Java3yTest的主函数入口(main),为main函数创建栈帧,开始执行main函数
- 3、main函数的第一条命令是
Java3y java3y = new Java3y();
就是让JVM创建一个Java3y对象,但是这时候方法区中没有Java3y类的信息,所以JVM马上加载Java3y类,把Java3y类的类型信息放到方法区中(元空间) - 4、加载完Java3y类之后,java虚拟机做的第一件事情就是在堆区中为一个新的Java3y实例分配内存, 然后调用构造函数初始化Java3y实例,这个Java3y实例持有着指向方法区的Java3y类的类型信息(其中包含有方法表,java动态绑定的底层实现)的引用
- 5、当使用
java3y.setName("Java3y");
的时候,JVM根据java3y引用找到Java3y对象,然后根据Java3y对象持有的引用定位到方法区中Java3y类的类型信息的方法表,获得setName()
函数的字节码的地址 - 6、为
setName()
函数创建栈帧,开始运行setName()
函数。
3.GC
相关阅读
java程序性能 当我们调优java程序时,通常的目标有两个: 响应能力 或者 吞吐量 响应能力 响应能力指一个程序或者系统对请求的是
JVM参数:-XX:ReservedCodeCacheSize
通过笨神的分享整理笔记: 这个参数主要设置codecache的大小,比如我们jit编译的代码都是放在codecache里的,所以codecache如果满了的
1 前言相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各
说明:做java开发的几乎都知道jvm这个名词,但是由于jvm对实际的简单开发的来说关联的还是不多,一般工作个一两年(当然不包括爱学习的及
首先是JDKJDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin