北滘大良网站制作,自己如何建设网站聊天室,做古代风格头像的网站,wordpress 输出jsonjvm是Java代码运行的环境#xff0c;他将java程序翻译成为机器可以可以识别的机器码#xff0c;可以跨平台运行如linuc或者windos
简单说一下我对jvm运行的理解#xff0c; 首先我们运行程序的时候#xff0c;类加载器会将类按需加载到元空间/方法区里面 … jvm是Java代码运行的环境他将java程序翻译成为机器可以可以识别的机器码可以跨平台运行如linuc或者windos
简单说一下我对jvm运行的理解 首先我们运行程序的时候类加载器会将类按需加载到元空间/方法区里面 然后启动线程的时候jvm就会给每个线程分配一个独立的栈如果有native方法就会有一个本地方法栈对应的每个线程会有一个 程序计数器 用于记录线程运行状态的线程运行到每一个方法就会有一个栈帧方法执行完 栈帧就会被释放后进先出当线程运行完成栈也就释放了 在线程运行过程中所新建和操作的一下临时对象就就会在堆中创建然后被引用当线程执行完成没有引用的对象在下一次垃圾回收执行的时候被清理。大体流程就是这样 类的加载触发是按需要加载的当被new到静态方法或静态成员被访问到反射操作等就会触发类的加载 类的加载过程加载连接初始化使用销毁 加载阶段工具类名将类的字节码通过文件、网络等方式读取到内存中然后解析加载到方法区/元空间中。 加载阶段完成之后就到连接 连接分为3个步骤首先是验证验证字节码结构语义是否复java约束规范 例如开头是否 cafe babe,验证通过就到准备阶段给静态变量分配内存给初始值常量赋值等 最后是解析阶段将符合引用替换为直接引用解析为直接内存地址链接阶段就算完成了 最后就是初始化了 静态变量初始值执行静态快 初始化完成就是可以使用了还有就是就是销毁虽然这个销毁很少发生 在内存不足full GC的时候 还是有可能被销毁的 类加载过程是按双亲委派模型的 因为类的加载器有 启动类加载器扩展类加载器应用类加载器每个加载器各自负责加载不通的类启动类加载java运行时环境所需的类 如string所在的lang包listmap所在的util包IO包等扩展类加载器就是加载bin/ext目录下的第三方库。应用类加载器就是加载我们写的类的所谓的双亲委派就是 一个类的加载器收到请求会先去尝试让父类加载向上委派如果父类加载过就不需要再加载例如应用类加载器收到请求 会委派给扩展类加载器扩展类加载器又委派给启动类加载器这样做的好处就是确保安全避免核心类被加载避免重复加载保证唯一。 类加载好了在程序启动线程的适合jvm就会给线程创建一个栈 这个栈是线程独有的线程执行完栈就会自动释放 在线程的运行过程中每执行到一个方法就会创建一个栈帧这个栈帧记录着方法执行的操作和数据。 栈帧保存的数据有局部变量表操作数栈如果加减乘除的结果操作完成就字符先先进后出还有动态链接方法内存地址和引用方法出口方法执行完成只有要干什么 方法执行完栈帧也就出来了他们后进先出的 线程运行过程程序计数器记录着 线程的运行位置在多线程情况下上下文切换的适合让程序继续执行。 栈也会内存溢出 只是发生的比较少还有一个深度不够的异常就是线程执行的方法太深如递归不过这些发生的情况还是很少的。栈就大概这么了 线程的运行过程中 会产生很多的引用对象这些读写被jvm分配到 堆中 堆是jvm最大的一个区域也是我们最关注的问题也是最频繁的处理不当就会产生内存溢出或内存泄漏 首先是内存分配对象被创建出jvm有几种内存分配方式 1指针碰撞如果堆的内存充足而且规则连续就会先数组移动指针一样分配这个成为指针碰撞这是简单快速的 2空闲列表就是在内存不规则的情况下jvm会维护一个空闲内存的列表然后把对象分散的分配 空间的是否规则要看选用的什么类型的垃圾回收机制有压缩整理功能的就会有规则的空间 serial,parNew(没有压缩整理)CMSG1sweep没有 3 本地线程分配缓存 简称TLAB,就是给每个线程分配一个独立的堆空间用于使用完自己的才去使用公共的。 对象的组成包含3部分,对象头实例数据补齐填充 对象头主要包含自身运行的数据hash码GC分代年龄锁状态标志偏凉锁线程id等 实例数据就是代码中各种成员变量 补齐填充占位用的就是为了补齐数 达到某个整数被提高CPU的访问效率 堆被分新生代和老年他们的占比默认是占1/3和2/3 其中新生代又分为eden区和Survivor区,Survivor又分为s1和s2区他们的默认比例811 在垃圾回收的时候 会先把eden区的回收然后把存活的对象放到s区经过多次垃圾回收还存活的对象就会升等到老年区只有在full gc的时候 老年区才会被回收
进入老年区的情况有以下几种1就是到达阈值指定的2到达阈值的大对象3动态年龄判断就是s区超过50%之后年龄大但却没有到阈值的4老年代空间担保机制每次mionr gc的时候都会先判断老年代剩余空间是否大于新生代的如果大于就直接gc 如果小于就会在判断 是否大于每次平均晋升值如果小于就直接full gc如果大于就minor gc 如果值多就会直接放到老年代