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

kingmax54212008 北京理工大学 2019-12-25 02:31:24
各位大佬,有支持监测java 大对象就报警的方法么?
或说一下思路。
...全文
65 点赞 收藏 7
写回复
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日
那就要看你这个所谓的大要怎么定义了,是字段方法多,还是占用内存大?
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告