欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 每日学习Java之一万个为什么?

每日学习Java之一万个为什么?

2025/4/27 15:34:44 来源:https://blog.csdn.net/m0_63497607/article/details/147490077  浏览:    关键词:每日学习Java之一万个为什么?

文章目录

  • RunnableFuture接口实现类
  • 线程池相关
    • 自定义CPU密集线程池Demo
    • AI定义拒绝策略 Demo
    • 线程池技术文档
    • Disruptor框架
  • JVM相关
    • JVM 内存结构
    • 双亲委派 / 沙盒安全
    • OOM demo
    • SOF demo
    • GC流程
    • GC roots
      • **备注**

RunnableFuture接口实现类

在这里插入图片描述

线程池相关

自定义CPU密集线程池Demo

package com.qxy.practice.concurrent;import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;/*** @author : 戚欣扬* @Description :*/
public class AutoIntegerDemo {public static void main(String[] args) {AtomicInteger autoInteger = new AtomicInteger(666);//定义一个标准CPU密集型设计线程池ExecutorService threadPoolExecutor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),Runtime.getRuntime().availableProcessors()+1,1L,TimeUnit.SECONDS,new ArrayBlockingQueue<>(6),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());System.out.println("I have "+Runtime.getRuntime().availableProcessors()+" processors");try {for (int i = 0; i < 5; i++) {threadPoolExecutor.execute(()->{for (int j = 0; j < 20; j++) {System.out.println(Thread.currentThread().getName()+" AInteger : "+autoInteger.incrementAndGet());}});}} catch (Exception e) {throw new RuntimeException(e);} finally {threadPoolExecutor.shutdown();}}
}

AI定义拒绝策略 Demo

import java.util.concurrent.*;public class AlibabaCustomRejectionHandler implements RejectedExecutionHandler {private static final Logger logger = LoggerFactory.getLogger(AlibabaCustomRejectionHandler.class);// 备用队列(可选,用于暂存被拒绝的任务)private final BlockingQueue<Runnable> backupQueue;public AlibabaCustomRejectionHandler(BlockingQueue<Runnable> backupQueue) {this.backupQueue = backupQueue;}@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 1. 记录日志logRejection(r, executor);// 2. 尝试将任务存入备用队列if (backupQueue != null && !executor.isShutdown()) {try {backupQueue.put(r);logger.info("Task {} backed up to secondary queue", r);} catch (InterruptedException e) {Thread.currentThread().interrupt();logger.error("Failed to backup task", e);}}// 3. 发送告警(可选,集成阿里云SLS或RocketMQ)sendAlert(r, executor);// 4. 降级策略:丢弃低优先级任务(示例)if (isLowPriorityTask(r)) {logger.warn("Discarded low-priority task: {}", r);return;}// 5. 如果以上均失败,抛出异常(可选)throw new RejectedExecutionException("Custom rejection policy failed for task: " + r);}private void logRejection(Runnable r, ThreadPoolExecutor executor) {logger.error("Rejected task: {} | Pool Status: [Active={}, Core={}, Max={}, " +"QueueSize={}, CompletedTasks={}]", r,executor.getActiveCount(),executor.getCorePoolSize(),executor.getMaximumPoolSize(),executor.getQueue().size(),executor.getCompletedTaskCount());}private void sendAlert(Runnable r, ThreadPoolExecutor executor) {// 集成阿里云SLS或RocketMQ发送告警(此处为伪代码)// Example:// AlibabaCloudSLSClient.log("ThreadPoolRejection", //     "Task=" + r + " | Pool=" + executor.toString());}private boolean isLowPriorityTask(Runnable r) {// 自定义逻辑判断任务优先级(例如:任务类名包含"LowPriority")return r.getClass().getName().contains("LowPriority");}
}

线程池技术文档

美团线程池技术概要

参考多线程网站

Disruptor框架

美团技术团队

JVM相关

JVM 内存结构

在这里插入图片描述

双亲委派 / 沙盒安全

在这里插入图片描述

OOM demo

package com.qxy.practice.jvm;/*** @author : 戚欣扬* @Description :*/
public class OOMdemo1 {byte[] bytes = new byte[1*1024*1024];public static void main(String[] args) {//设置虚拟机参数:-Xlog:gc* -Xms10m -Xmx10mOOMdemo1 [] arr = new OOMdemo1[1000];System.out.println("start memory :"+Runtime.getRuntime().totalMemory()/(1024*1024));System.out.println("max memory :"+Runtime.getRuntime().maxMemory()/(1024*1024));int i = 0;while (true){arr[i++]=new OOMdemo1();}}
}

SOF demo

package com.qxy.practice.jvm;/*** @author : 戚欣扬* @Description :*/
public class SOFdemo {public void sof(){sof();}public static void main(String[] args) {SOFdemo soFdemo = new SOFdemo();System.out.println(soFdemo.getClass().getClassLoader());System.out.println(soFdemo.getClass().getClassLoader().getParent());System.out.println(soFdemo.getClass().getClassLoader().getParent().getParent());soFdemo.sof();}
}

GC流程

Java HotSpot JVM的GC流程:分代收集,Young代触发Minor GC标记清理,Old代触发Major/Full GC整理内存,优化空间分配,减少碎片。

GC roots

分类具体类型描述
虚拟机栈(Java Stack)栈帧中的局部变量表引用的对象包括方法的局部变量、参数等,只要在当前活跃的栈帧中,即被视为 GC Root。
方法区(Method Area)类的静态字段(Static Fields)类的静态变量引用的对象,生命周期与类加载器绑定。
常量池(Runtime Constant Pool)中的引用对象包括字符串常量池、类符号引用等,可能引用堆中的对象。
本地方法栈(Native Stack)JNI(Java Native Interface)引用的对象通过本地方法调用(如 C/C++)中引用的 Java 对象。
活跃线程(Active Threads)正在运行的线程对象本身线程对象及其栈中的局部变量均属于 GC Root。
线程栈中的局部变量和参数线程执行过程中创建的临时对象或参数。
同步监控对象(Monitor)synchronized 锁持有的对象同步块或方法中使用的监视器对象,可能引用其他对象。
系统类加载器(Class Loaders)系统类加载器(Bootstrap、Extension、Application)加载的类及其静态字段这些类及其静态变量通常不会被回收,引用的对象也是 GC Root。
JVM 内部对象JVM 内部管理的对象(如 ClassMethodField 等)JVM 自身维护的元数据对象,例如类对象、方法句柄等。
异常类(如 NullPointerExceptionOutOfMemoryErrorJVM 内部常驻的异常类对象。
系统类加载器(如 ClassLoader 实例)负责加载类的加载器对象本身。
反射与工具接口通过反射 API(如 java.lang.reflect 包)创建的引用反射机制可能持有的对象引用(如 MethodField 实例)。
JMXBean、JVMTI 回调、本地代码缓存用于监控或调试的 JVM 内部对象。
其他特殊场景临时性 GC Roots(如分代回收中的跨代引用)根据垃圾收集器策略,某些临时对象可能被临时标记为 GC Root(如局部回收时的关联对象)。
用户手动设置的引用(如 WeakReferenceSoftReference通过显式引用保留的对象(需注意:弱引用不会阻止对象被回收,但某些引用可能被特殊处理)。

备注

  1. 核心原则:所有 可达对象 必须能通过 GC Roots 的引用链追溯到,否则会被回收。
  2. 实现差异:不同 JVM 实现(如 HotSpot、OpenJDK)或垃圾收集器(如 G1、CMS)可能对 GC Roots 的具体处理略有差异。
  3. 动态性:某些 GC Roots(如活跃线程或本地方法引用)是动态变化的,随程序执行而改变。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词