有支持监测java 大对象就报警的方法么?

kingmax54212008 2019-12-25 02:31:24
各位大佬,有支持监测java 大对象就报警的方法么?
或说一下思路。
...全文
211 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingmax54212008 2019-12-26
  • 打赏
  • 举报
回复
引用 5 楼 树成 的回复:
[quote=引用 3 楼 kingmax54212008 的回复:] [quote=引用 1 楼 树成 的回复:] 那就要看你这个所谓的大要怎么定义了,是字段方法多,还是占用内存大?
比如举一个例子,超过5M的大对象就报警。[/quote] 一般内存中的对象都很小,几乎都小鱼1KB,所以一般对象会超过5M,只有一种可能,就是对象内部某个字段的数据特别大,这类数据只可能是String或者byte[] ,而且这类对象是很容易预见的,建议只做针对性的检查,说白了直接检测某字段数据即可。 如果是内存中所有对象的检测是完全没有必要的,这种做法没有意义。 不过有一个实现的思路,但是这是有前提的,而且不好,既是所有对象都实现序列化接口,所有产生的对象在统一的地方注册,再写一个工具定时序列化所有对象,然后查看它们序列化以后的长度,不过你不会想这么做的。[/quote] 我们交易链路出现了一个90M的大对象,这个交易链路都炸了。 【一个老业务,但运维给配置的关联数据太多。谁都没想到会炸了。】 不能从理论来理解。线上什么问题,都会出现,所以, 我们需要做大对象检测的报警!
树成 2019-12-26
  • 打赏
  • 举报
回复
引用 3 楼 kingmax54212008 的回复:
[quote=引用 1 楼 树成 的回复:] 那就要看你这个所谓的大要怎么定义了,是字段方法多,还是占用内存大?
比如举一个例子,超过5M的大对象就报警。[/quote] 一般内存中的对象都很小,几乎都小鱼1KB,所以一般对象会超过5M,只有一种可能,就是对象内部某个字段的数据特别大,这类数据只可能是String或者byte[] ,而且这类对象是很容易预见的,建议只做针对性的检查,说白了直接检测某字段数据即可。 如果是内存中所有对象的检测是完全没有必要的,这种做法没有意义。 不过有一个实现的思路,但是这是有前提的,而且不好,既是所有对象都实现序列化接口,所有产生的对象在统一的地方注册,再写一个工具定时序列化所有对象,然后查看它们序列化以后的长度,不过你不会想这么做的。
kingmax54212008 2019-12-26
  • 打赏
  • 举报
回复
引用 2 楼 qybao 的回复:
你可以参照一下java.lang.management包 MemoryNotificationInfo或许能用上。
看了一下,MemoryNotificationInfo只是泛泛的检查java内存。没有具体到某个对象的大小检测。
kingmax54212008 2019-12-26
  • 打赏
  • 举报
回复
引用 1 楼 树成 的回复:
那就要看你这个所谓的大要怎么定义了,是字段方法多,还是占用内存大?
比如举一个例子,超过5M的大对象就报警。
qybao 2019-12-26
  • 打赏
  • 举报
回复
引用 4 楼 kingmax54212008 的回复:
看了一下,MemoryNotificationInfo只是泛泛的检查java内存。没有具体到某个对象的大小检测。

本来想着在对象创建时候监视内存的变化(重设阈值使其触发事件或者自己获取内存大小计算),看来这条路行不通
还有个思路或者可以试试
通过java代理(agentmain)方式获取Instrumentation实例,通过它的getObjectSize方法可获取对象的大小,再结合构造方法拦截,或许可行
qybao 2019-12-25
  • 打赏
  • 举报
回复
你可以参照一下java.lang.management包
MemoryNotificationInfo或许能用上。
树成 2019-12-25
  • 打赏
  • 举报
回复
那就要看你这个所谓的大要怎么定义了,是字段方法多,还是占用内存大?

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧