我所关注的Java问题

Java作为一个发展了多年的语言,由于历史包袱等原因,自然会有不少问题,这里讲的是Oracle Hotspot(其他的JVM会有些不同),我最关注的主要是以下几个:

1. 对大内存的支持
内存容量发展越来越大,而自然Java应用也会越多的面对大内存的场景,目前Java在大内存的情况下,有两个主要的问题:
* GC问题,CMS GC最大的问题是碎片,碎片所导致的不可预知的Full GC的行为是非常可怕的,我们都有好几个应用开始要在每天低峰的时候强制执行full gc来避免碎片问题,G1GC也仍然是有碎片问题的…
* 排查问题,大内存的情况下dump、分析目前的Hotspot支持的都非常糟糕。

2. 启动瞬间慢的问题
Hotspot在刚启动时是解释模式,逐步才编译为native代码,因此一定会出现启动瞬间慢的现象,这个问题很容易导致有些访问量很高的应用在启动瞬间会出现非常多的请求失败的现象,尽管目前Hotspot也做了很多的努力,例如TieredCompilation等。

3. coroutine
很多的Java应用在处理请求时都会有大量的访问后端的行为,例如访问数据库、调用其他应用等,由于是线程模式,会导致在支撑很高的并发时会比较容易达到瓶颈,而coroutine对于类似这样的场景,会有不小的帮助。
而更进一步,对于分布式的Java应用来说,在一次请求中可能会有大量的并行的后端调用,这种时候如果是线程模式也不是很好做。

4. 序列化/反序列化
这个算比较特殊的一个点,在一次请求要访问非常多后端的情况下,序列化/反序列化通常会成为很重要的一个CPU的消耗点,而根据我们以往的排查我们能看到主要的原因还是在序列化/反序列化中从对象到流,以及从流到对象的过程,所以如果能在这里有突破的话,会对分布式的Java应用有很大的帮助。

5. 字符串append
之前我们在分析Java应用的内存消耗时,会看到StringBuilder/StringBuffer.append造成的char[]数组的扩充造成了主要的内存消耗,而其实这个如果有改进是可以大幅减少内存消耗的压力的(在我们的很多应用上,我们可以看到在很高并发量时GC占据的CPU还是不少的)。

这里还有一个牛人写的JVM implementation challenges的pdf,感兴趣的也可以看看。

你有什么特别关心的Java问题呢,也可以回复我说说看。

=============================
欢迎关注微信公众号:hellojavacases

关于此微信号:
分享Java问题排查的Case、Java业界的动态和新技术、Java的一些小知识点Test,以及和大家一起讨论一些Java问题或场景,这里只有Java细节的分享,没有大道理、大架构和大框架。

公众号上发布的消息都存放在http://hellojava.info上。

《我所关注的Java问题》有1个想法

  1. 关于coroutine,个人觉得callback更好一些:

    private static void funA(int a) {
    call(a, new Callback() {
    public void callbak(int c) {
    funB(c);
    }
    });
    }

    private static void funB(int b) {
    //
    call(b, new Callback() {
    public void callbak(int c) {
    funC(c);
    }
    });
    }

    private static void funC(int c) {
    //
    }

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*