手机网站 源码,网页制作需要哪些软件,有没有什么做统计的网站,全球最大的磁力搜索引擎JVM 前言程序计数器#xff0c;栈#xff0c;虚拟机栈#xff1a;本地方法栈#xff1a;堆#xff0c;方法区#xff1a;堆内存溢出方法区运行时常量池 垃圾回收垃圾回收算法分代回收 前言 JVM 可以理解的代码就叫做字节码#xff08;即扩展名为 .class 的文件#xff… JVM 前言程序计数器栈虚拟机栈本地方法栈堆方法区堆内存溢出方法区运行时常量池 垃圾回收垃圾回收算法分代回收 前言 JVM 可以理解的代码就叫做字节码即扩展名为 .class 的文件它不面向任何特定的处理器只面向虚拟机
程序计数器栈
程序计数器作用是记住下一条jvm指令的执行地址 线程私有的不会存在内存溢出
虚拟机栈
不需要垃圾回收 栈内存分配不是越大越好越大能分配的线程数会变少 活动栈帧栈顶的那个栈帧正在执行的那个方法
栈内存溢出 栈帧过多导致栈内存溢出 比如递归方法反复调用自己没有临界条件只有一直入栈没有出栈释放 栈帧过大导致栈内存溢出
本地方法栈
本地方法native method不是有Java语言编写的代码由C、C编写的本地方法调用的时候就放在本地方法栈 堆方法区
通过 new 关键字创建对象都会使用堆内存 特点 它是线程共享的堆中对象都需要考虑线程安全的问题 有垃圾回收机制
堆内存溢出
大量对象占据了堆空间这些对象都持有强引用导致无法回收
解决办法
使用Xmx参数指定一个更大的堆空间由于堆空间不可能无限增长分析找到大量占用对空间的对象在应用程序上做出优化 还有jvirsualvm
方法区 方法区Method Area被所有线程共享用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
运行时常量池 常量池就是一张表虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息 运行时常量池常量池是 *.class 文件中的当该类被加载它的常量池信息就会放入运行时常量池并把里面的符号地址变为真实地址
StringTable:
常量池中的字符串仅是符号第一次用到时才变为对象,用串池Stringtable(串池的机制来避免重复创建字符串对象字符串变量拼接的原理是 StringBuilder视频说明s1s2符串常量拼接的原理是编译期优化{“a“b”}
垃圾回收
1.可达性分析算法
Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象扫描堆中的对象看是否能够沿着 GC Root对象 为起点的引用链找到该对象找不到表示可以回收 强引用 只有所有 GC Roots 对象都不通过【强引用】引用该对象该对象才能被垃圾回收 软引用SoftReference 仅有软引用引用该对象时在垃圾回收后内存仍不足时会再次出发垃圾回收回收软引用对象可以配合引用队列来释放软引用自身 弱引用WeakReference 仅有弱引用引用该对象时在垃圾回收时无论内存是否充足都会回收弱引用对象可以配合引用队列来释放软引用自身 虚引用PhantomReference 必须配合引用队列使用主要配合 ByteBuffer 使用被引用对象回收时会将虚引用入队由 Reference Handler 线程调用虚引用相关方法释放直接内存 视频3分钟处 终结器引用FinalReference 无需手动编码但其内部配合引用队列使用在垃圾回收时终结器引用入队被引用对象暂时没有被回收再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize方法第二次 GC 时才能回收被引用对象
垃圾回收算法
标记清除速度较快但会造成内存碎片标记整理无内存碎片但速度较慢复制不会有内存碎片需要占用双倍内存空间
分代回收