![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【八股】jvm
白速龙王的回眸
一命二运三风水
四积功德五读书
六名七相八敬神
九交贵人十养生
展开
-
【jvm】常见调优参数、system.gc(), 静态变量存储位置
【jvm常见调优参数】-Xms:初始堆大小-Xmx:最大堆大小-XX: NewSize 年轻代大小-XX:MaxNewSize 年轻代最大值-XX: PermSize 永生代初始值-XX:MaxPermSize 永生代最大值-XX:NewRatio 新生代和永生代的比例【调用system.gc()一定会发生垃圾收集吗?为什么】调用System.gc()并不会马上垃圾收集,只会把这次gc请求记录下来需要配合System.runFianlization()才会真正回收【静态变量存储位置】原创 2022-04-04 14:45:39 · 140 阅读 · 0 评论 -
【jvm】双亲委派机制优点、破坏、构建自定义类加载器
【双亲委派机制的优点】1.避免类的重复加载。相同的类被不同的类加载器加载会产生不同的类,双亲委派保证了java程序的稳定运行2.保证核心api不被修改(不会重复加载)【如何破坏双亲委派机制】重载loadClass()方法,即自定义类加载器【如何构建自定义类加载器】1.新建自定义类继承自java.lang.ClassLoader2.重写findClass, loadClass, defineClass方法...原创 2022-04-03 19:15:53 · 373 阅读 · 0 评论 -
【jvm】jvm类加载过程,类加载器,双亲委派机制
【简述jvm类加载过程】加载:通过全类名获取类的二进制字节流;将类的静态存储结果转化为方法区的运行时数据结构;在内存中生成类的Class对象,作为方法区数据的入口验证:对文件格式,元数据,字节码,符号引用等验证正确性准备:在方法区内为类变量分配内存并设置为0值解析:将符号引用转化为直接引用初始化:执行类构造器init方法,真正初始化【jvm中的类加载器】BootstrapClassLoader启动类加载器:加载/lib下的jar包和类,cpp编写ExtensionClassLoader扩展类原创 2022-04-02 11:53:20 · 459 阅读 · 0 评论 -
【jvm】Minor GC,Full GC, 常见内存分配策略
【简述Minor GC】Minor GC指发生在新生代的垃圾收集,因为java对象大多存活时间短,所以MinorGC非常频繁,一般回收速度比较快【简述Full GC】Full GC是清理整个堆空间-包括年轻代和永久代。调用System.gc(),老年代空间不足,空间分配担保失败,永久代空间不足会产生full gc【常见内存分配策略】大多数情况下对象在新生代Eden区分配,当Eden没有足够空间将发起一次Minor GC大对象需要大量连续内存空间,直接进入老年代区分配如果经历过第一次MinorG原创 2022-04-01 22:19:01 · 445 阅读 · 0 评论 -
【jvm】为什么jvm有这么多垃圾收集器
【简述Parallel Scavenge垃圾收集器】注意吞吐量,即cpu运行代码时间/cpu耗时总时间(cpu运行代码时间+垃圾回收时间)。新生代使用标记复制算法,老年代使用标记整理算法。【简述CMS垃圾收集器】注重最短时间停顿。CMS垃圾收集器为最早提出的并发收集器,垃圾收集线程与用户线程同时工作。采用标记清除算法。该收集器分为初始标记、并发标记、并发预处理、并发清除、并发重置几个步骤。初始标记:暂停其他线程(stop the world),标记与GC roots直接关联的对象并发标记:可达性分原创 2022-03-31 11:23:09 · 576 阅读 · 0 评论 -
【jvm】分代收集算法、Serial垃圾收集器、ParNew垃圾收集器
jvm垃圾管理员石锤了【简述分代收集算法】根据对象存活周期将内存划分为几块,不同块采用适当的收集算法一般分为新生代和老年代新生代使用复制算法老年代使用标记清楚或标记整理算法【简述Serial垃圾收集器】单线程串行收集器,回收时,必须暂停其他所有线程。新生代使用标记复制,老年代使用标记整理,简单高校【ParNew垃圾收集器】Serail的多线程版本,新生代使用标记复制,老年代使用标记整理...原创 2022-03-30 14:20:03 · 323 阅读 · 0 评论 -
【jvm】判断垃圾、引用类型、标记算法
【如何判断对象是否是垃圾】引用计数法:设置引用计数器,对象被引用计数器加1,引用失效计数器减1,如果计数器为0就是垃圾。会存在对象间循环引用的问题,一般不用这种方法。可达性分析:通过GC Roots的根对象作为起始节点,从这些节点开始,根据引用关系向下搜索,如果某个对象没有被搜到,则会被标记为垃圾。可作为GC Roots的对象包括虚拟机栈和本地方法栈中引用的对象、类静态属性引用的对象、常量引用的对象【简述java的引用类型】强引用:被强引用关联的对象不会被回收,一般采用new方法创建强引用软引用:原创 2022-03-29 11:23:16 · 584 阅读 · 0 评论 -
【jvm】分配内存策略、保证线程安全、内存布局
【简述jvm给对象分配内存的策略】指针碰撞:这种方式在内存中放一个指针作为分界指示器,将使用过的内存放在一边,空闲的放在另一边,通过指针挪动完成分配空闲列表:对于java堆内存不规整的情况,jvm必须维护一个列表记录哪些内存可用,在分配时从列表中找到一块足够大的空间划分给对象并更新列表记录【java对象内存分配是如何保证线程安全的】对分配内存空间采用CAS机制,配合失败重试的方式保证更新操作的原子性,该方式效率低每个线程在Java堆中预先分配一小块内存,然后再给对象分配内存的时候,直接在自己这块“原创 2022-03-28 14:19:28 · 514 阅读 · 0 评论 -
【jvm】runtime常量池、直接内存、java创建对象过程
【简述运行时常量池】运行时常量池存放常量池表,用于存放编译器生成的各种字面量和符号引用。一般除了保存class文件中描述的符号引用外,还会把符号引用翻译的直接引用耶存储在运行时常量池。除此之外,也会存放字符串基本类型。jdk8后把运行时常量池放到堆中【简述直接内存】直接内存也称为堆外内存,就是把内存对象分配在jvm堆外的内存区域。这部分内存不是jvm管理,而是os管理。java通过DirectByteBuffer对其进行操作,避免了java堆和Native堆来回复制数据【简述java创建对象的过程原创 2022-03-26 16:10:06 · 241 阅读 · 0 评论 -
【jvm】本地方法栈,堆,方法区
【简述本地方法栈】本地方法栈和jvm栈作用类似,不同的是jvm栈为jvm执行java方法服务,本地方法栈为本地方法服务。可以将jvm栈看成普通的java函数对应的内存模型,本地方法栈看作由native关键词修饰的函数对应的内存模型本地方法栈的两种异常:StackOverflowError,OutOfMemoryError【简述jvm中的堆】堆主要作用是存放对象实例,java里几乎所有对象实例都在堆分配内存,堆也是内存管理中最大的一块。java垃圾回收主要针对堆进行处理。-Xms和-Xmx设置堆的最小原创 2022-03-25 14:04:38 · 1229 阅读 · 0 评论 -
【jvm】内存模型、程序计数器、栈
【简述jvm内存模型】线程私有的运行时数据区:程序计数器、java虚拟机栈、本地方法栈线程共享的运行时数据区:java堆、方法区【简述程序计数器】程序计数器表示当前线程执行的字节码的行号指示器不会产生StackOverflowError和OutOfMemoryError【简述虚拟机栈】java虚拟机栈用来描述java方法执行的内存模型。线程创建时就会分配一个栈空间,线程结束后栈空间被回收。栈中元素用于支持虚拟机进行方法调用,每个方法在执行时都会创建一个栈帧存储方法的局部变量表、操作栈、动态链原创 2022-03-24 14:52:57 · 1316 阅读 · 0 评论