Poison


  • 首页

  • 归档

  • 标签

  • 搜索
close
Poison

Debug Multithreaded Applications

发表于 2021-11-24

在调试多线程应用程序时,有时我们需要暂停单独的线程而不是整个应用程序,此时在断点上可以设置 Suspend 为 Thread,而不是默认的 All。关于这两个选项的区别,在 Breakpoints | IntelliJ IDEA 中的说明如下:

The following policies are available for the breakpoints that suspend program execution:

  • All: all threads are suspended when any of the threads hits the breakpoint.
  • Thread: only the thread which hits the breakpoint is suspended.
Reference

Tutorial: Detect concurrency issues | IntelliJ IDEA

Poison

IdentityHashMap

发表于 2021-11-22

最近使用 ANTLR4 时看到其 ParseTreeProperty 类用到了 IdentityHashMap,本文简要记录。

根据 IdentityHashMap 的 Java Doc 可知:

This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values). In other words, in an IdentityHashMap, two keys k1 and k2 are considered equal if and only if (k1==k2). (In normal Map implementations (like HashMap) two keys k1 and k2 are considered equal if and only if (k1==null ? k2==null : k1.equals(k2)).)

其与 HashMap 的最大不同为比较 key 时,IdentityHashMap 仅比较引用,而 HashMap 则是调用的 key 的 equals 方法进行比较,同时,文档中还提到:

A typical use of this class is topology-preserving object graph transformations, such as serialization or deep-copying.

阅读全文 »
Poison

Biased Locking

发表于 2021-11-17

之前在 System.identityHashCode() 一文中我们知道,如果生成对象的 hashCode 时对象持有偏向锁,则会撤销该偏向锁。原因为对象默认的 hashCode 与偏向锁占用了对象头中的同一片区域,是不可以同时使用的。

对象头的格式可以参考 jdk/markOop.hpp at jdk8-b120 与 Dashboard - Lilliput - Main - OpenJDK Wiki。

关于偏向锁的实现原理可以参考:Dashboard - HotSpot - Main - Runtime - Synchronization - OpenJDK Wiki,其中提到了当生成对象的默认 hashCode 时,如果存在偏向锁,则会撤销偏向锁,原文如下:

The bias is also revoked when the identity hash code of an object is accessed since the hash code bits are shared with the thread ID.

值得注意的是自 JDK 15 开始,偏向锁已经被废弃了,具体原因可以参考:JEP 374: Deprecate and Disable Biased Locking,此处不再赘述。

Poison

System.identityHashCode()

发表于 2021-11-17

之前在 Serializable 一文中简单提及了 Object.hashCode() 方法的实现,今天在看 IdentityHashMap 的源码时看到对 System.identityHashCode() 方法的调用,本文简要记录。

首先在 System.identityHashCode() 的 Java Doc 中有如下下说明:

Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object’s class overrides hashCode(). The hash code for the null reference is zero.

阅读全文 »
Poison

Kubernetes #66607

发表于 2021-11-08

我们在部分应用部署至 K8s 集群后发现一个问题,若应用 A 与应用 B 都部署至 K8s 的集群中,且应用 B 对接了负载均衡在公网通过 HTTPS 暴露其 HTTP 接口,负载均衡在七层协议层进行 HTTPS 流量解密这种场景下,应用 A 通过 HTTPS 接口请求负载均衡时,K8s 内部会将 IP 直接路由至应用 B 的节点,导致流量没有经过负载均衡,从而使 HTTPS 流量被发送至 HTTP 服务的端口,触发 SSL 握手异常。

在 Java 层中的部分异常栈帧如下:

1
2
3
4
5
6
7
8
Caused by: javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
at sun.security.ssl.SSLSocketInputRecord.handleUnknownRecord(SSLSocketInputRecord.java:448)
at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:174)
at sun.security.ssl.SSLTransport.decode(SSLTransport.java:110)
at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1290)
at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1199)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:401)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:373)

使用 curl 命令的异常信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
* TCP_NODELAY set
* Connected to lb_domain (39.103.236.188) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* error:1408F10B:SSL routines:ssl3_get_record:wrong version number
* stopped the pause stream!
* Closing connection 0
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

路由信息可以通过 traceroute 命令查看,关于该问题的讨论及解决方案可以参考下方链接,因为该问题官方还没有修复,最后我们通过引入 Ingress 来做流量路由解决的该问题。

Reference

DigitalOcean Kubernetes and SSL wrong version number error for the requests from inside a pod | by ismail yenigül | FAUN Publication
Why kube-proxy add external-lb’s address to node local iptables rule? · Issue #66607 · kubernetes/kubernetes · GitHub
enhancements/keps/sig-network/1860-kube-proxy-IP-node-binding at master · kubernetes/enhancements · GitHub
Add IP mode field to loadbalancer status ingress by Sh4d1 · Pull Request #97681 · kubernetes/kubernetes · GitHub

1…111213…26

130 日志
119 标签
GitHub LeetCode
© 2025 Poison 蜀ICP备16000644号
由 Hexo 强力驱动
主题 - NexT.Mist