莆田网站建设五维网络有限公司,网站可以做多语言的吗,企业网站托管排版设计制作,在线制作logo模板JVM分为两个子系统,两个组件一个子系统是Class loader类装载系统#xff0c;另一个子系统是Execution Engine执行引擎一个组件是Runtime data area 运行时数据区#xff0c;Native Interface 本地接口Class loader#xff1a;根据给定的全限定类名来装载class文件到运行时数…JVM分为两个子系统,两个组件一个子系统是Class loader类装载系统另一个子系统是Execution Engine执行引擎一个组件是Runtime data area 运行时数据区Native Interface 本地接口Class loader根据给定的全限定类名来装载class文件到运行时数据区的方法区执行引擎执行classses中的指令本地接口用来和其他语言交互Android的JNI运行时数据区就是JVM的内存作用通过编译器将java文件转成字节码ClassLoader将字节码加载到内存运行时数据区字节码是JVM的一套指令集规范不能直接给底层操作系统执行需要经过执行引擎将字节码翻译成底层系统指令再交给CPU去执行这个过程需要调用本地接口来实现编写的java源码.java文件通过javac转成字节码.class文件classLoader将这些.class文件加载到JVM内存就是运行时数据区classLoader将.class文件的二进制数据加载到jvm内存的方法区然后在堆区创建对应的类对象用来封装类在方法区的数据结构。JVM内存就是只JVM的运行时数据区此区域包含线程数据共享区方法区堆区线程数隔离区虚拟机栈方法栈程序计数器程序计数器当前程序所执行的字节码行号指示器字节码解析的工作就是通过改变计数器的值一行一行的解析字节码指令分支、循环、跳转、异常处理线程恢复等基础功能都依赖这个计数器虚拟机栈存储局部变量表、操作数栈、动态链接、方法出口本地方法与虚拟机栈作用一样只是为了调用native方法服务堆区jvm内存中最大的一块被所有线程共享几乎所有对象的实例都在这里分配内存方法区用来存储已经被加载到JVM内存的类信息常量静态变量即时编译后的数据浅拷贝内存地址是同一个增加一个指针指向此内存地址深拷贝增加一个指针且申请一个新的内存地址指针指向的是新的内存地址浅复制复制被指向的内存地址如果原地址发生变化浅复制出来的对象也会发生变化深复制在计算机中开辟一块新的内存地址用来存放复制的对象堆栈区别物理地址堆的物理地址是不连续的栈的物理地址是连续的栈使用的是数据结构中的栈先进后出原则性能更快内存分别堆的地址是不连续的分配内存是在运行时确认大小不固定堆一般远大于栈栈是连续的分配内存是在编译期间大小固定存放的内容堆存放的是对象的实例和数组更关注数据的存储栈存放局部变量操作数栈返回结果更关注方法的执行静态变量放在方法区也就是线程共享静态对象放在堆区也是线程共享程序可见度堆不仅线程共享整个程序也共享栈只对线程共享是线程私有声明周期和线程相同队列和栈这里讲的是数据存储也就是数据结构中叫法不同栈是进栈出栈队列是入队出队队列是插入在队尾取数据在队头栈是存取数据都在栈头也就是队列是先进先出栈是先进后出对象内存分配分配内存时并发内存泄漏长生命周期的对象持有短生命周期对象的引用可能引发内存泄漏短生命周期对象已经不需要了但是因为长生命周期对象持有对他的引用导致不能被回收java回收机制在java中不需要显式的去释放一个对象的内存由JVM执行有一个垃圾回收线程低优先级在JVM空闲和堆内存不足时触发执行回收那些没有被引用的实例对象添加到回收集合中进行回收GC当创建对象时GC开始监控对象的地址、引用和大小GC确定一些对象不可达可达性算法时会回收这些对象的内存空间调用system.gc()通知gc运行但不一定立马回收引用类型强引用gc也不会回收软引用有用但不是必须存在的对象在内存溢出之前会被回收弱引用有用但不是必须存在的对象在下一次GC时会被回收虚引用不能通过虚引用获取对象要通过PhantomReference实现虚引用用途是在gc时会返回一个通知判断对象是否可以被回收引用计数器每个对象都有一个引用计数器被引用一次1当前引用被释放就-1当引用计数器0时可以回收不能解决循环引用可达性算法从gc roots向下检索搜索走过的路径称为引用链当对象对应gc roots引用链上没有任何引用时可以回收jvm回收算法标记-清除法标记无用对象进行清除---效率不高无法清除垃圾碎片复制算法按照容量一分为二当一份用完时将或者的对象复制到另一份把已使用的内存情理标记-整理标记无用对象让所有存活的对象都向一端移动然后直接清除掉端边界意外的内存分代算法根据对象存活周期的不同将内存划分为几块一般是新生代和老年代新生代使用复制算法老年代使用标记整理算法类加载器启动类加载器 BootStrap ClassLoader 加载java核心类库无法被java程序直接使用扩展类加载器 extensions class loader 加载java扩展库系统类加载器 system class loader 根据java应用的类路径加载类用户自定义类加载器继承ClassLoader类实现类加载的过程加载根据查找路径查找相应的class文件导入JVM的运行时区域验证检查加载的class文件的正确性准备给类中的静态变量分配内存解析jvm将常量池中的符号引用替换成直接应用的过程变量类似变成对象类型初始化对静态变量和静态代码块进行初始化使用、卸载类的加载将类的.class文件中的二进制数据读入到内存运行时数据区中将数据放在方法区中然后在堆区创建一个java.lang.Class对象用来封装在方法区内的数据结构双亲委派任何一个类加载器收到了加载类的请求不会自己直接加载类而是将这个请求交给父类如果父类能加载就由父类加载如果父类加载器不能加载反馈给子类由子类加载器加载这个类。每一层的类加载器都是这样所以所有的加载请求都会被传递到定层的bootstrap classloader中只有他不能加载时才反馈给子类加载使用Profiler和Heap dump来查看java堆空间检查对象内存和内存泄漏ClassLoader源码自定义类加载器继承ClassLoader重写findClass方法重要的是二进制数据的解析不要重写loadClass方法破坏双亲委托