摘要: 内存溢出场景 Java heap space,堆内存不足 metaspace 或 Permgen space,方法区不足 GC overhead limit exceeded,超过 98% 时间在做 GC,但是回收内存不到 2% 默认开启 UseGCOverheadLimit,当超过 98% 时间在 阅读全文
posted @ 2023-04-14 16:51 CyrusHuang 阅读(7) 评论(0) 推荐(0) 编辑
摘要: 内存 参数 作用 解释和建议 -Xms 设置堆内存最小值 与 Xmx 相等 -Xmx 设置堆内存最大值 与 Xms 相等 -Xmn 设置新生代大小(绝对值) 设置为整个堆空间的1/4或1/3过小会增加 Minor GC频率,过大会减小老年代的大小新生代+老年代=堆,这里设置新生代空间,剩下的就是老年 阅读全文
posted @ 2023-04-14 16:12 CyrusHuang 阅读(82) 评论(0) 推荐(0) 编辑
摘要: 工作模式 串行、并行(吞吐量) 垃圾回收期的线程数量,如果是一个就是串行,如果是多个就是并行 并发式、独占式(STW时间,响应优先,低延迟) 垃圾回收器的线程工作期间,用户线程要暂停,就是独占式 如果和用户线程一起执行就是并发式(不是真的一起工作,而是把垃圾回收的时间打散,比如垃圾回收要10s,分成 阅读全文
posted @ 2023-04-14 15:01 CyrusHuang 阅读(20) 评论(0) 推荐(0) 编辑
摘要: 强引用 java 默认就是强引用,没什么好说的 软引用 当触发 Full GC 时,如果内存够用不回收,如果内存不够用就回收(不要带入强引用的观念,也不要考虑是不是垃圾,这时纯粹看内存够不够) // SoftReference<Object> sf = new SoftReference<Objec 阅读全文
posted @ 2023-04-14 14:01 CyrusHuang 阅读(9) 评论(0) 推荐(0) 编辑
摘要: 垃圾判定算法 引用计数法 记录每个对象的使用次数,某个对象每增加一次引用,其引用计数器+1,当引用失效,引用计数器-1,当引用计数器为0,对象就视为垃圾 优点:实现起来很简单 缺点:无法解决循环引用的问题,如下图(明明是垃圾,但是没有被回收,这就是内存泄露) java 没有采用引用计数,但是因为其原 阅读全文
posted @ 2023-04-14 13:38 CyrusHuang 阅读(24) 评论(0) 推荐(0) 编辑
摘要: 经典三大问题 哪些内存需要回收? 什么时候回收? 如何回收? GC 区域和分类 JVM 在垃圾回收时,不是每次都回收新生代、老年代、方法区,大多数时候是仅发生在新生代 新生代频繁发生 很少发生在老年代 几乎不回收方法区(1.7永久代,1.8元空间) HotSpot VM 的 GC 分为两大类,部分收 阅读全文
posted @ 2023-04-14 11:56 CyrusHuang 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 对象内存布局 对象内存分配过程 对象新建优先分配在 Eden 区(大对象会直接分配到老年代,多大的对象是大对象可以配置) 当 Eden 满了,还有对象进来,触发 minor GC minor GC 过程 如果是垃圾(引用计数法、可达性法确定是否是垃圾)就删除,如果不是垃圾,就把对象移动到幸存1区,存 阅读全文
posted @ 2023-04-14 11:44 CyrusHuang 阅读(16) 评论(0) 推荐(0) 编辑
摘要: 组成结构 线程私有:程序计数器、本地方法栈、虚拟机栈 线程共享:方法区、堆 程序计数器 线程私有,存储下一条字节码指令的行号 也叫 PC 寄存器,存储下一条要执行的指令行号(如果下一条指令是 native 方法,记录的行号是 undefined) class 最终被编译成字节码指令,CPU 能执行的 阅读全文
posted @ 2023-04-14 10:26 CyrusHuang 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 类加载步骤 加载:简言之,将 Class 文件(可能是类、可能是接口)加载到内存中,并在内存中创建一个对应的 Class 实例 类的信息、数据、结构等放在放在方法区(jdk1.8之前永久代,1.8之后元空间) Class 文件对应的 Class 对象是在堆中 链接 验证:简言之,语法的校验,比如 f 阅读全文
posted @ 2023-04-14 09:59 CyrusHuang 阅读(20) 评论(0) 推荐(0) 编辑
摘要: JAVA 跨平台 java 编译成 class 文件 不同操作系统有不同的 jre 环境,不同操作系统的 jre 都能读取同一份 class 文件 jre 包含 jvm,所以 java 跨平台是因为不同操作系统有对应的 jvm 实现的 JDK、JRE、JVM JDK:Java Development 阅读全文
posted @ 2023-04-14 09:45 CyrusHuang 阅读(88) 评论(0) 推荐(0) 编辑