`
san_yun
  • 浏览: 2654585 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

HashMap cpu占用 100%

 
阅读更多

 


今天在重现出HashMap cpu占用100%了,只要并发稍微大一点就会出现,我用一个本地HashMap mock一个Memcached的客户端,通过netty暴露结果中招了:下面是打印的jstack:

 

 

jstack 写道
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.5-b03 mixed mode):

"Attach Listener" daemon prio=10 tid=0x0000000054d55800 nid=0x78a0 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"New I/O server worker #1-16" prio=10 tid=0x0000000054d88000 nid=0x785e runnable [0x0000000044425000]
java.lang.Thread.State: RUNNABLE
at java.util.HashMap.get(HashMap.java:303)
at com.duitang.cat.LocalCacheServiceImpl.get(LocalCacheServiceImpl.java:22)
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.duitang.dboss.service.ServiceInvoker.accept(ServiceInvoker.java:52)
at com.duitang.dboss.remote.nio.DbossServerHandler.messageReceived(DbossServerHandler.java:60)
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:98)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:796)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:391)
at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:317)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:299)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:216)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:80)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:555)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:345)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:332)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:323)
at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:275)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:196)
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
at org.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:46)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

"New I/O server worker #1-14" prio=10 tid=0x0000000054d53800 nid=0x785c runnable [0x0000000044223000]
java.lang.Thread.State: RUNNABLE
at java.util.HashMap.put(HashMap.java:374)
at com.duitang.cat.LocalCacheServiceImpl.set(LocalCacheServiceImpl.java:13)
at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.duitang.dboss.service.ServiceInvoker.accept(ServiceInvoker.java:52)
at com.duitang.dboss.remote.nio.DbossServerHandler.messageReceived(DbossServerHandler.java:60)
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:98)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:796)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:391)
at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:317)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:299)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:214)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:80)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:555)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:345)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:332)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:323)
at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:275)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:196)
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
at org.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:46)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

  可以发现在:at java.util.HashMap.get(HashMap.java:303) 有一个for循环调用内部的next()方法,而同时,另外一个线程在put操作: java.util.HashMap.put(HashMap.java:374) ,据说这两处在某种情况会导致死循环。结果我的cache服务器也挂了:

connect: Connection refused ('192.168.172.2', 8989)
connect: Connection refused ('192.168.172.2', 8989)
connect: Connection refused ('192.168.172.2', 8989)
connect: Connection refused ('192.168.172.2', 8989)
connect: Connection refused ('192.168.172.2', 8989)
connect: Connection refused ('192.168.172.2', 8989)
connect: Connection refused ('192.168.172.2', 8989)

 

 

  • 大小: 10.5 KB
分享到:
评论

相关推荐

    Java进程cpu占用过高问题解决

    Java进程cpu占用过高问题解决 Java进程cpu占用过高问题解决是指Java进程中cpu占用率过高的问题,导致了系统性能下降和服务器崩溃。解决这个问题需要了解Java进程的cpu占用率的原因,并采取相应的措施来解决。 cpu...

    HashMap与ConcurrentHashMap面试要点.pdf

    但是,在多线程环境下使用头插法会引起循环链表的问题,从而导致CPU飙升。 - **JDK8的HashMap**底层数据结构仍为数组+链表,但新增了红黑树结构。在JDK8中,链表采用尾插法(tail-insertion),即新插入的元素被...

    线程死锁CPU过高,请求原因分析

    4. **计算密集型任务**:执行大量计算的任务,如大数据处理、加密解密等,会占用大量CPU资源。 WeakHashMap在死锁和CPU过高的问题中可能扮演的角色: 1. **锁竞争**:虽然WeakHashMap本身的内部实现是线程安全的,...

    FLASH开发内存cpu控制

    在Flash开发中,优化内存和...以上技巧可以帮助开发者提高Flash应用的性能,降低内存占用,减少CPU消耗,从而提升整体用户体验。在实际开发过程中,持续关注和优化这些细节,是创造高效、流畅的Flash应用程序的关键。

    nark-hashmap-master.zip_数据结构_Visual_C++_

    1. **开放寻址法**:当发生哈希冲突时,nark-hashmap可能会寻找下一个未被占用的数组位置。这通常通过线性探测、二次探测或双哈希等策略实现。线性探测是最简单的方法,但可能导致聚集现象;二次探测和双哈希则能更...

    如何编写高效的ANDROID代码

    - **CPU使用率**:分析哪些操作占用了大量的CPU时间。 - **网络请求频率**:减少不必要的网络请求可以显著提高性能。 #### 二、避免过早优化 在软件开发领域,过早优化常常被视为“所有邪恶之源”。这意味着,在...

    java performance8

    这包括但不限于测量代码执行时间、CPU利用率、内存占用等指标的变化。 ### 结论 通过对给定内容的分析,我们可以看到Java性能优化是一个涉及多方面考量的过程。从简单的循环优化到复杂的数据结构选择,每一步都...

    ConcurrentHashMap的实现原理(JDK1.7和JDK1.8).pdf

    在多线程环境中,如果多个线程同时修改HashMap,可能会引发死循环,导致CPU利用率极高。 - `HashTable`是线程安全的,但其线程安全的实现方式过于简单,所有操作都使用`synchronized`关键字,这使得在高并发环境下...

    Java面试题之原理底层面试题》》持续更新

    - JVM调优主要包括堆内存分配(如年轻代、年老代、持久代)、垃圾回收监控、线程信息监控和CPU、内存热点分析等。 - 工具如`jps`、`jstat`、`jmap`、`jstack`和JMC(Java Mission Control)可以帮助进行监控和分析...

    2022面试题6java背诵版本.doc

    13. **Linux服务器CPU100%定位问题**: - top或htop命令查看占用CPU高的进程。 - strace跟踪系统调用,分析哪个函数消耗CPU。 - jstack分析Java应用的线程堆栈。 14. **JDK自带的工具**: - jconsole:JVM监控...

    如何快速定位线上Doris FE内存使用过高问题? (1).pdf

    接下来,我们可以通过`head -20 jmap.text`来查看前100个占用内存最多的对象。这将帮助我们识别哪些类或数据结构可能消耗了大量的内存。 例如,在输出中,我们可能看到如下统计: 1. `[B` 类型的对象(字节数组)...

    2022面试题1java背诵版本.doc

    8. **排查OOM问题手段**:分析堆转储文件(Heap Dump)、检查内存泄漏工具(如VisualVM、MAT)、监控JVM内存使用、优化代码以减少内存占用等。 9. **MySQL事务隔离级别**:包括读未提交(Read Uncommitted)、读已...

    scjd sample questions

    - **扩展效率低**:Vector的扩展是通过数组复制完成的,当容量不足时,会创建一个更大的新数组并将原有元素复制过去,这个过程耗时且占用较多CPU资源。 - **空间浪费**:由于同步机制,Vector在多线程环境下可能会...

    (java面试笔试题库

    进程是操作系统资源分配的基本单位,它包括运行中的程序和程序所占用的资源,如CPU时间、内存等。线程是程序执行流的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中可以有多个线程,它们共享...

    java面试宝典题

    每种数据类型都有其固定的内存占用大小。 - **Byte**: 占用1个字节,范围从-128到127。 - **Short**: 占用2个字节,范围从-32768到32767。 - **Int**: 占用4个字节,是最常用的整型数据类型。 - **Long**: 占用8个...

    有用的面试题整理.pdf(粉丝 私信 免费领取)

    - Session存储数据在服务器端,占用服务器资源,安全性较高。 - Cookie数据存储在客户端,易于被用户查看和篡改,但减少了服务器负担。 7. **线程安全问题** - HashMap在resize操作时可能存在线程不安全问题,...

    2021-2022计算机二级等级考试试题及答案No.3570.docx

    17. 存储占用:字符串包含字符编码,空格(' ')占用1字节,'0'也是1字节,数字0占用1字节,浮点数0.0通常占用4到8字节,因此0.0占用最多。 18. 构造函数:构造函数没有返回值类型,它用于初始化对象。 19. Word复制...

    JAVA提速_fox

    1. **单例模式**:单例模式可以限制类的实例只有一个,减少内存占用,提高效率。但过度使用可能导致设计复杂性增加,应当谨慎使用,只在确实需要控制资源、限制实例数量或共享数据时使用。 2. **避免滥用静态变量**...

Global site tag (gtag.js) - Google Analytics