java中内存占用问题是什么?数据问题是什么?

BSO 2020-11-28 15:39:30 java常见问答 6987

我们平时在学习java的过程中,总是会遇到各种各样的问题,这也是是因为java本身的知识就是非常的具有延展性,所以需要我们花费很多的时间去解决。关于它的内存占用问题也是很麻烦的,一起来看看吧。

首先,我们需要知道的是,因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象。

注意:在复制的时候只是复制容器里的引用。

只是在写的时候会创建新对象添加到新容器里,而旧容器的对象还在使用,所以有两份对象内存)。如果这些对象占用的内存比较大,比如说200M左右,那么再写入100M数据进去,内存就会占用300M,那么这个时候很有可能造成频繁的Yong GC和Full GC。

系统中使用了一个服务由于每晚使用CopyOnWrite机制更新大对象,造成了每晚15秒的Full GC,应用响应时间也随之变长。

针对内存占用问题,可以通过压缩容器中的元素的方法来减少大对象的内存消耗,比如,如果元素全是10进制的数字,可以考虑把它压缩成36进制或64进制。或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。

另外就是,数据一致性问题

CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。

最后说一下关于CopyOnWrite的应用场景

CopyOnWrite并发容器用于读多写少的并发场景。比如白名单,黑名单,商品类目的访问和更新场景,假如我们有一个搜索网站,用户在这个网站的搜索框中,输入关键字搜索内容,但是某些关键字不允许被搜索。

这些不能被搜索的关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。

可以看出内存占用问题还是很好解决的,遵循一定的方法还是很好做的。java中有很多繁琐的知识,如果你想要了解更多java常见问题,敬请关注奇Q工具网。

推荐阅读:

java堆栈内存是如何实现的?

java栈内存动态扩展要怎么理解?要如何实现?

JVM的内存模型是指什么?JVM的内存如何分配?