V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  fantastM  ›  全部回复第 7 页 / 共 17 页
回复总数  330
1 ... 3  4  5  6  7  8  9  10  11  12 ... 17  
2021-01-27 14:30:52 +08:00
回复了 Cbdy 创建的主题 Java 求一个 Java 面试题的最佳实践
#10 说的方案是可行的,并且是基于 CAS 无锁的

https://gist.github.com/fantasticmao/f78ae0016a81877cf5019d9c22c81c73
简单回答:可以在 agent 中自定义类加载器,避免遵循 Java 类加载器中的双亲委派模型。

详细回答:
JVM 加载类是按照双亲委派模型来执行的,每个类都会优先委托给父类加载器来加载,当父类加载器无法加载类的时候再由子类加载器来加载,因此在 JVM 中加载的类会有一种层级关系。

在你的例子中 `ThreadPoolExecutor` 会由 BootStrap ClassLoader 加载,参数 -javaagent 指定的 baselog.jar 包默认会由 System ClassLoader 加载,所以你一开始描述的问题原因是:`ThreadPoolExecutor` 类在被 BootStrap ClassLoader 加载之后链接的时候,无法找到需要被 System ClassLoader 加载的 baselog.jar 包里的 `MDCInheritableThreadLocal`。(注意这个问题是发生在链接阶段,这也是 JVM 为什么抛了 `NoClassDefFoundError` 而不是 `ClassNotFoundException` 的原因)

然后你将 baselog.jar 包指定为由 BootStrap ClassLoader 加载,这样的话,`ThreadPoolExecutor` 类在被 BootStrap ClassLoader 加载、链接、初始化的时候,就可以找到同样是被 BootStrap ClassLoader 加载的 `MDCInheritableThreadLocal` 了。

你在 #7 里说的事情,我理解为是你在 baselog.jar 包里用到了「项目中的引入的 jar 」(可能是 Spring 之类的吧),这部分包不由是 BootStrap ClassLoader 加载的,可能是 System ClassLoader,也可能是 Tomcat 的 Webapp ClassLoader,所以自然也会有 `ClassNotFoundException` 的问题。解决方案的话,我不建议把这类包也指定为由 BootStrap ClassLoader 来加载,更好的解决方案是自定义类加载机制,破坏一下 Java 类加载器中的双亲委派模型。

具体实现的话,可以借鉴一些分布式追踪 APM 系统,它们在采集应用的数据时候,使用的无侵入式方案也是 javaagent,也会对项目中的一些代码做改造。

一些可供查阅的资料:
https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html
在启动参数里用 -javaagent 的话,确实是如 #3 说的类加载问题。可以用 arthas 的 sc 、classloader 之类的命令来查看类的加载情况
2021-01-25 01:57:14 +08:00
回复了 James369 创建的主题 Linux 为什么终端有那么多的名称?
kernel 、system call 、shell 这几个的关系,看这段描述应该就清楚了

https://i.imgur.com/pPw6ldg.png
2021-01-19 11:21:44 +08:00
回复了 gengzi 创建的主题 Java 请教一个问题, threadPoolExecutor.execute()能被 AOP 增强吗?
@eaglewangl37670 #7 不妨看看我博客里的这篇文章,对线程池的源码分析得更多 :)

https://blog.fantasticmao.cn/2020/10/01/java-threadpoolexecutor-源码分析 /
2021-01-18 20:42:00 +08:00
回复了 gengzi 创建的主题 Java 请教一个问题, threadPoolExecutor.execute()能被 AOP 增强吗?
> 想在线程执行前,执行后,做一些事情

ThreadPoolExecutor 内部提供了两个钩子方法 beforeExecute(Thread, Runnable) 和 afterExecute(Runnable, Throwable),正好符合你的需求。具体的看源码就清楚了 https://github.com/openjdk/jdk/blob/jdk8-b21/jdk/src/share/classes/java/util/concurrent/ThreadPoolExecutor.java#L1098-L1130
2021-01-15 11:31:26 +08:00
回复了 bigpigeon 创建的主题 Linux rocketmq 踩坑和吐槽
对于第一点,据我了解,Kafka 中的分区和消费者也是这种设计。这样做的原因估计是在实现上会简单很多吧
2021-01-11 14:53:36 +08:00
回复了 zsxzy 创建的主题 分享创造 更新 Airplay 投屏应用, 新增 2K 画质投屏
楼主是在哪儿阅读 Airplay 协议的
2020-12-17 11:39:18 +08:00
回复了 luxinfl 创建的主题 程序员 面试碰到一个问题,搞不定
先同步调用 a,再用线程池异步并行地调用 bcde 。

因为整合数据时,需要保证 bcde 请求调用完成,所以就用一下 CountDownLatch 来实现这个等待机制。
2020-12-16 22:59:16 +08:00
回复了 nightspirit 创建的主题 职场话题 某滴面试题,请教答案
#8 这两个关系都存一下
2020-12-16 22:57:51 +08:00
回复了 nightspirit 创建的主题 职场话题 某滴面试题,请教答案
订单 id -> 用户 id,用户 id -> 订单 id
2020-12-04 16:16:43 +08:00
回复了 nekoneko 创建的主题 Elasticsearch 一个关于 ES 的问题,和_stats 这个接口有关
看来老哥也是个宝可梦粉
2020-11-16 13:34:04 +08:00
回复了 coderabbit 创建的主题 程序员 通过 charles 抓淘宝 app 抓包抓不到数据!
可以在浏览器上抓 m.taobao.com 上的请求
2020-11-14 01:59:44 +08:00
回复了 yangkw 创建的主题 酷工作 杭州阿里-新零售场景金融技术部- Java p6p7
多问一下,是 base 杭州吗,哪个区呢
2020-11-10 14:59:30 +08:00
回复了 linxiaoziruo 创建的主题 Java 类 jprofiler 是怎么在 jvm 运行时获得 jvm 相关信息的
2020-11-05 22:43:18 +08:00
回复了 funway 创建的主题 分享创造 发布了一个 macOS 的倒计时小工具
不错。顺带想问下楼主学习 SwiftUI 的途径是什么?
2020-11-05 14:27:44 +08:00
回复了 lambdafate 创建的主题 程序员 有没有简洁的博客主题推荐一下
2020-10-26 00:44:20 +08:00
回复了 Eempty 创建的主题 酷工作 [杭州] 字节跳动招人啦~
字节杭州的面试强度怎么样
2020-10-20 09:24:37 +08:00
回复了 gigizhazha 创建的主题 问与答 前端比后端简单吗
美学 -> 界面 -> 前端 -> 接口 -> 后端 -> 机器 -> 数学
1 ... 3  4  5  6  7  8  9  10  11  12 ... 17  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1184 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 35ms · UTC 18:32 · PVG 02:32 · LAX 11:32 · JFK 14:32
Developed with CodeLauncher
♥ Do have faith in what you're doing.