常州网站公司网站深圳哪个网站建设公司好

当前位置: 首页 > news >正文

常州网站公司网站,深圳哪个网站建设公司好,怎么把本地wordpress上传,如何在word上做网站网址文章目录 一、JVM组成1.什么是程序计数器2.什么是Java堆#xff1f;3.能不能介绍一下方法区(元空间#xff09;4.你听过直接内存吗5.什么是虚拟机栈6.垃圾回收是否涉及栈内存#xff1f;7.栈内存分配越大越好吗#xff1f;8.方法内的局部变量是否线程安全#xff1f;9.什么… 文章目录 一、JVM组成1.什么是程序计数器2.什么是Java堆3.能不能介绍一下方法区(元空间4.你听过直接内存吗5.什么是虚拟机栈6.垃圾回收是否涉及栈内存7.栈内存分配越大越好吗8.方法内的局部变量是否线程安全9.什么情况下会导致栈内存溢出10.堆栈的区别是什么 二、类加载器11.什么是类加载器类加载器有哪些12.什么是双亲委派模型13.JVM为什么采用双亲委派机制14.说一下类装载的执行过程 三、垃圾回收15.强引用、软引用、弱引用、虚对象什么时候可以被垃圾器回收15.1 对象什么时候可以被垃圾器回收 16.JVM 垃圾回收算法有哪些16.1 标记清除算法16.2 标记整理算法( 标记清除算法的升级—多了一个整理阶段16.3 复制算法 17.说一下JVM中的分代回收17.1 MinorGC、 Mixed GC 、 FullGC的区别是什么 18.说一下JVM有哪些垃圾回收器19.详细聊一下G1垃圾回收器 四、JVM实践20.JVM 调优的参数可以在哪里设置21.用的 JVM 调优的参数都有哪些22.说一下 JVM 调优的工具23.Java内存泄露的排查思路24.CPU飙高排查方案与思路 JVM是什么 JVMJava虚拟机是Java程序的 运行环境它是Java平台的核心组成部分之一。JVM提供了一个 运行Java字节码的虚拟机负责将 Java程序解释和执行。 Java程序员可以在JVM上编写和运行Java程序而不用考虑底层操作系统的差异性。JVM的特性使得Java具备了跨平台性同一份Java代码可以在不同的操作系统上运行。 组成部分如下
一、JVM组成 1.什么是程序计数器 程序计数器线程私有的内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。(通俗的来说就是记录当前线程的程序执行的字节码指令的行号 2.什么是Java堆 线程共享的区域主要用来保存对象实例数组等当堆中没有内存空间可分配给实例也无法再扩展时则抛出OutOfMemoryError异常。 Java1.8-JVM内存结构 其中堆分为两部分 年轻代 包括三部分Eden区和两个大小严格相同的Survivor区根据JVM的策略在经过几次垃圾收集后任然存活于Survivor的对象将被移动到老年代区间。 老年代 主要保存生命周期长的对象一般是一些老的对象 元空间 保存的类信息、静态变量、常量、编译后的代码 Java1.7-JVM内存结构 唯一的不同就是在java8的JVM中元空间是在本地内存中的而java7当中元空间是作为方法区/永久代存在于堆空间中的 因而在1.8之后做出改动主要是为了防止OMM内存泄漏因为元空间方法区/永久代保存的是类信息、静态变量、常量、编译后的代码随着程序不断庞大实现很难预估元空间的大小久而久之就会产生OMM。 在旧的Java版本如Java 7及更早版本中方法区和永久代PermGen都是堆的一部分用于存储类的结构信息、常量池、静态变量等。但永久代容易导致内存溢出的问题因为它的大小是固定的并且无法在运行时动态调整。 为了解决这个问题并改进类的元数据的存储方式Java 8 引入了元空间Metaspace。元空间通过使用本地内存来存储类的元数据有效地解决了永久代的限制和内存溢出问题。与永久代不同元空间的大小并不受堆内存大小的限制而是受系统的物理内存限制。 元空间还具有自动调整大小的能力可以根据需要动态地分配和释放内存。这使得元空间更具灵活性和可靠性并能更好地适应各种应用程序的需求。 3.能不能介绍一下方法区(元空间 在不同的JVM实现中方法区存在位置是不一样的。 这里举例在jdk1.7时的jvm
方法区(Method Area)是各个线程共享的内存区域 主要存储类的信息、运行时常量池 虚拟机启动的时候创建关闭虚拟机时释放 如果方法区域中的内存无法满足分配请求则会抛出OutOfMemoryError: Metaspace 普通常量池 可以看作是一张表虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息 通俗的说就是记录了虚拟机指令和执行的类名、方法名等信息的映射关系。 编译阶段常量池的符号引用为这种#数字因为只是编译阶段没到运行阶段只需要直到机器指令和方法、类名等等的映射关系能找到对应上就算编译通过 运行时常量池 在类加载阶段JVM会将符号引用解析为直接引用将符号替换为真实的地址值并将其存储在常量池中以供运行时使用。 *常量池是 .class 文件中的当该类被加载它的常量池信息就会放入运行时常量池并把里面的符号地址变为真实地址 4.你听过直接内存吗 直接内存并不属于JVM中的内存结构不由JVM进行管理。是虚拟机的系统内存常见于NIO(非阻塞io操作时用于数据缓冲区它分配回收成本较高但读写性能高 直接内存最直接的体现就是常规IO和NIO的区别 我们都知道NIO是非阻塞的IO是传统阻塞式 IO传统阻塞式 相当于java程序不能直接去读系统内存给的数据需要一个媒介就是堆内存java缓冲区 NIO非阻塞式 相比较IO是直接到直接内存读数据所以只要将磁盘文件读到直接内存数据准备就绪程序切换到内核态就直接从直接内存读数据。 5.什么是虚拟机栈 通俗来说就是线程的方法栈 Java Virtual machine Stacks (java 虚拟机栈) 每个线程运行时所需要的内存称为虚拟机栈先进后出 每个栈由多个栈帧frame组成(一个栈帧代表一个方法占用的内存对应着每次方法调用时所占用的内存 每个线程只能有一个活动栈帧对应着当前正在执行的那个方法 也就是一个方法主方法可以调用其他很多别的方法子方法 6.垃圾回收是否涉及栈内存 垃圾回收主要指就是堆内存当栈帧弹栈以后内存就会释放 7.栈内存分配越大越好吗 未必默认的栈内存通常为1024k 栈帧过大会导致线程数变少例如机器总内存为512m目前能活动的线程数则为512个如果把栈内存改为2048k那么能活动的栈帧就会减半 很好理解机器内存就那么多单独把栈内存调大了那么栈帧的个数自然的得变少所以对应的线程数就会变少 8.方法内的局部变量是否线程安全 如果方法内局部变量没有逃离方法的作用范围它是线程安全的 如果是局部变量引用了对象并逃离方法的作用范围需要考虑线程安全 通俗来说就是看方法内的局部变量是不是完全包围在方法内像如果是作为方法参数传过来的、作为返回值返回的都可以算是逃离了方法的作用范围这样别的线程可以肆意修改方法内的局部变量 9.什么情况下会导致栈内存溢出 栈帧过多导致栈内存溢出典型问题递归调用
栈帧过大导致栈内存溢出(基本上不存在 栈的容量较小相对于堆内存而言栈内存的容量通常比较有限。每个线程都有自己的栈空间而每个栈的大小通常只有几MB到几十MB。这限制了栈帧的大小使得栈溢出的概率较低。 10.堆栈的区别是什么 分配对象和数据类型堆内存用于分配Java对象和数组。所有通过关键字new创建的对象以及通过反射或JNI创建的对象都存储在堆中。而栈内存主要用于存储基本数据类型的变量和方法调用时的局部变量。 存储位置堆内存位于JVM的堆区是一个共享的内存区域。栈内存位于JVM的栈区每个线程都有自己的独立栈。 内存管理方式堆内存的分配和回收由Java虚拟机的垃圾回收器负责管理。垃圾回收器会自动回收不再使用的对象并释放对应的内存空间。而栈内存的分配和回收是由编译器自动管理的当方法执行结束或变量超出作用域时栈上的内存会自动被释放。 内存分配速度堆内存的分配速度相对较慢因为需要进行复杂的垃圾回收算法和对象定位操作。而栈内存的分配速度较快仅仅是简单地进行指针移动。 内存空间大小限制堆内存的大小一般比栈内存大得多。堆内存的大小可以通过JVM的配置参数进行调整。而栈内存的大小是由线程的启动参数决定的每个线程的栈大小通常是固定的。 对象的生命周期堆内存中的对象生命周期可以很长可以在程序的任意位置被引用和访问。而栈内存中的局部变量生命周期与方法调用密切相关当方法执行结束时栈上的局部变量会自动销毁。 总结来说堆内存主要用于存储Java对象和数组由垃圾回收器管理分配和回收速度相对较慢而栈内存主要用于存储基本数据类型的变量和方法调用时的局部变量由编译器自动管理分配和回收速度相对较快。两者在内存管理方式、存储位置、分配速度和大小等方面有较大的区别。 二、类加载器 11.什么是类加载器类加载器有哪些 类加载器 JVM只会运行二进制文件类加载器的作用就是将字节码文件加载到JVM中从而让Java程序能够启动起来。 类加载器包括四种 启动类加载器(加载像库里自带的类string integer等等(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库 扩展类加载器(ExtClassLoader):主要加载JAVA_HOME/jre/lib/ext目录中的类 应用类加载器加载自己java程序写的类(AppClassLoader):用于加载classPath下的类 自定义类加载器(很少自己写加载器(CustomizeClassLoader):自定义类继承ClassLoader实现自定义类加载规则。 12.什么是双亲委派模型 加载某一个类先委托上一级的加载器进行加载如果上级加载器也有上级则会继续向上委托如果该类委托上级没有被加载子加载器尝试加载该类 举例 假设有一个Student类,需要加载 这个时候就会定位到AppclassLoader应用类加载器,发现应用记载器有上级加载器就先不加载看看上级加载器里面有没有加载过的Student类一直往上找发现都没有加载过的Student类那么此时AppclassLoader才会去加载Student类 假设有一个String类,需要加载也是定位到AppclassLoader应用类加载器往上委托直到找到启动类加载器,找到了加载好的String类直接加载。 13.JVM为什么采用双亲委派机制 JVM采用双亲委派机制Parent Delegation Model是为了解决两个主要问题 安全性和避免类的重复加载。 安全性体现在 确保核心Java库的安全性避免恶意代码通过自定义的类伪装成核心类库从而提高系统的安全性。 例如下面我们自己创建一个String包装类此时核心类库是本身就会加载这个类这个时候就会报错不允许加载自定义的核心库的类。 双亲委派机制可以确保核心Java库的安全性。当一个类需要被加载时首先会委派给父类加载器进行查找和加载只有在父类加载器无法找到该类时才会由当前类加载器自己去加载。 避免类的重复加载体现在 通过双亲委派机制当一个类需要被加载时首先由父类加载器尝试加载如果父类加载器已经加载了该类就直接返回否则再由子类加载器尝试加载。这种机制可以确保在整个类加载器层次结构中每个类只被加载一次避免了类的重复加载提高了运行效率。 14.说一下类装载的执行过程 类在装载的时候会经历7个过程 加载:查找和导入class文件验证:保证加载类的准确性准备:为类变量分配内存并设置类变量初始值解析:把类中的符号引用转换为直接引用初始化:对类的静态变量静态代码块执行初始化操作使用:JVM 开始从入口方法开始执行用户的程序代码卸载:当用户程序代码执行完毕后JVM便开始销毁创建的Class对象。 详细参考链接【JVM】类装载的执行过程 三、垃圾回收 15.强引用、软引用、弱引用、虚对象什么时候可以被垃圾器回收 15.1 对象什么时候可以被垃圾器回收 垃圾回收回收的是针对于堆的
简单一句就是如果一个或多个对象没有任何的引用指向它了那么这个对象现在就是垃圾如果定位了垃圾则有可能会被垃圾回收器回收。 如果要定位什么是垃圾有两种方式来确定第一个是引用计数法第二个是可达性分析算法 引用计数法(不常用 一个对象被引用了一次在当前的对象头上递增一次引用次数(ref1)如果这个对象的引用次数为0(ref0)代表这个对象可回收 但是当对象间出现了循环引用的话则引用计数法就会失效
可达性分析算法 现在的虚拟机采用的都是通过可达性分析算法来确定哪些内容是垃圾。 比如下面的例子 X,Y这两个节点是可回收的 Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象 扫描堆中的对象看是否能够沿着 GC Root 对象 为起点的引用链找到该对象找不到表示可以回收 哪些对象可以作为 GC Root ? 虚拟机栈栈帧中的本地变量表中引用的对象 方法区中类静态属性引用的对象 方法区中常量引用的对象 本地方法栈中 JNI即一般说的 Native 方法引用的对象 16.JVM 垃圾回收算法有哪些 参考链接GC详解、GC四大算法和GC Root 总共分为三种 标记清除算法垃圾回收分为2个阶段分别是标记和清除,效率高,有磁盘碎片内存不连续 标记整理算法标记清除算法一样将存活对象都向内存另一端移动然后清理边界以外的垃圾无碎片对象需要移动效率低 复制算法将原有的内存空间一分为二每次只用其中的一块,正在使用的对象复制到另一个内存空间中然后将该内存空间清空交换两个内存的角色完成垃圾的回收;无碎片内存使用率低 16.1 标记清除算法 标记清除算法是将垃圾回收分为2个阶段分别是标记和清除。 1.根据可达性分析算法得出的垃圾进行标记 2.对这些标记为可回收的内容进行垃圾回收 注意标记GC Root引用链的对象回收的就是没有被标记的 缺点 需要两次扫描耗时严重。 先扫描一次对存活的对象进行标记。 再次扫描回收没有被标记的对象。 会产生内存碎片导致内存空间不连续。 当需要分配一个较大的内存块时由于没有足够的连续内存空间可能会导致分配失败即内存溢出。 16.2 标记整理算法( 标记清除算法的升级—多了一个整理阶段 优缺点同标记清除算法解决了标记清除算法的碎片化的问题同时标记压缩算法多了一步对象移动内存位置的步骤其效率也有有一定的影响。 相比较标记清除算法在垃圾回收后会将活着的对象滑动到一侧这样就能让空出的内存空间是连续的。
16.3 复制算法 相当于把一块堆内存分成两半来用一般拿来存对象另一半拿来做垃圾回收后的整理收纳仓必须为空闲空间 复制算法需要将存活的对象从一个区域复制到另一个区域(空白区域然后直接清空存活对象和待回收对象的那一片区域 注意要求堆内存的使用比例不超过50%因为每次垃圾回收时需要保证目标区域有足够的空间来存放从源区域复制过来的对象。 优点 在垃圾对象多的情况下效率较高 清理后内存无碎片 缺点 分配的2块内存空间在同一个时刻只能使用一半内存使用率较低 17.说一下JVM中的分代回收 一、堆的区域划分 堆被分为了两份新生代和老年代【12】 对于新生代内部又被分为了三个区域。Eden区幸存者区survivor(分成from和to)【811】 二、对象回收分代回收策略 新创建的对象都会先分配到eden区当伊甸园内存不足标记伊甸园与 from现阶段没有的存活对象将存活对象采用复制算法复制到to中复制完毕后伊甸园和 from 内存都得到释放经过一段时间后伊甸园的内存又出现不足标记eden区域to区存活的对象将其复制到from区当幸存区对象熬过几次回收最多15次晋升到老年代幸存区内存不足或大对象会提前晋升 参考链接【JVM】JVM中的分代回收 17.1 MinorGC、 Mixed GC 、 FullGC的区别是什么 STWStop-The-World暂停所有应用程序线程等待垃圾回收的完成 MinorGC、 Mixed GC 、 FullGC 相当于垃圾回收的等级
MinorGC【young GC】发生在新生代的垃圾回收暂停时间短STW Mixed GC 新生代 老年代部分区域的垃圾回收G1 收集器特有 FullGC 新生代 老年代完整垃圾回收暂停时间长STW应尽力避免 18.说一下JVM有哪些垃圾回收器 在jvm中实现了多种垃圾收集器包括 串行垃圾收集器 Serial 作用于新生代采用复制算法 Serial Old 作用于老年代采用标记-整理算法 并行垃圾收集器JDK8默认使用此垃圾回收器 Parallel New作用于新生代采用复制算法 Parallel Old作用于老年代采用标记-整理算法 CMS并发垃圾收集器 针对老年代垃圾回收的 G1垃圾收集器(在JDK9之后默认使用 应用于新生代和老年代
详细参考链接 19.详细聊一下G1垃圾回收器 四、JVM实践 20.JVM 调优的参数可以在哪里设置 21.用的 JVM 调优的参数都有哪些 22.说一下 JVM 调优的工具 23.Java内存泄露的排查思路 24.CPU飙高排查方案与思路