面试阿里巴巴,只因不懂JVM,面试官让我回去等通知

阿里巴巴如何面试?网友分享出你不知道的真实面试流程(转发给有需要的人) 知道了阿里的招聘渠道 不知道如何面试? 没关系 小编贴心的为你整理了一些 快来学习学习吧 记得给小编点个赞哦 网友一: 面试岗位 java面试经验(杭州) - 阿里巴巴 面试过程: 在某个下午,收到阿里的电话,问是否有意愿,想了一下,阿里的机会尝试一下。过程之中,面试官很nice,只是最后有些问题没有答的很好,后面就被发了好人卡,很伤心呐 面试官问的面试题: 1、自我介绍以及项目介绍 2、spring-cloud是否了解,spring-boot是了解,讲一讲bean的生命周期 3 阅读详情

前言

JVM的GC机制绝对是很多程序员的福音,它让Java程序员省去了自己回收垃圾的烦恼。从而可以把大部分时间专注业务身上,大大提高了业务开发速度,让产品需求尽快的落地抢占市场。但是也正因为如此,导致很多Java程序员对JVM和GC知之甚少,以我愚见大家对JVM&GC不够了解的有几个原因:

  • 门槛太高。我们平常接触的spring,dubbo,java集合&J.U.C,网上都有无数优秀的文章对其深入的分析。而且都是基于Java语言,我们在学习的过程中,可以自己很容易的debug源码更深入的了解。但是JVM则不然,它是C++开发的,能同时掌握C++和Java的程序员还是很少的,自己也不太好debug分析它的源码(就是编译jvm源码,都要折腾一番)。

  • 有价值的系列文章太少。网上几乎没有完整体系的文章,优秀的书籍也很少(可能大家听过或者看过最多的就是周志明的深入理解Java虚拟机,这确实是JVM领域比较少见的佳作)。

  • 接触的太少。虽然我们天天写Java代码,你写的每行代码JVM都会参与工作。但是很少进行GC调优,因为JVM是如此的优秀,绝大部分情况下,它只是默默的做你背后的女人(即使出问题了,也轮不到我们去排查,扎心了)。

对于JVM&GC,很多人没有去了解它,很多人也没机会去了解它,甚至有部分人都不原因去了解它。然而要想成为一名优秀的Java程序员,了解JVM和它的GC机制,写出JVM GC机制更喜欢的代码。并且你能知道JVM这个背后的女人是否发脾气了,还知道她发脾气的原因,这是必须要掌握的一门技术,是通往高级甚至优秀必须具备的技能。

这篇文章我不打算普及JVM&GC基础,而是主要讲解如何初步诊断GC是否正常,重点讲解诊断GC。所以看这篇文章的前提,需要你对JVM有一定的了解,比如常用的垃圾回收器,Java堆的模型等。如果你还对JVM一无所知,并且确实想初步了解这门技术,那么请先花点时间看一下周志明的<<深入理解Java虚拟机>>,重点关注"第二部分 自动内存管理机制"。

GC概念纠正

初步诊断GC之前,先对GC中最常误解的几个概念普及一下。对GC机制有一定了解的同学都知道,GC主要有YoungGC,OldGC,FullGC(还有G1中独有的Mixed GC,收集整个young区以及部分Old区,提及的概率相对少很多,本篇文章不打算讲解),大概解释一下这三种GC,因为很多很多的同学对OldGC和FullGC有非常大的误解;

  • Young GC:应该是最没有歧义的一种GC了,只是有些地方称之为Minor GC,或者简称YGC,都是没有问题的;

  • Old GC:截止Java发展到现在JDK9为止,只单独回收Old区的只有CMS GC,并且我们常说的CMS是指它的background collection模式,这个模式包含CMS GC完整的5个阶段:初始化标记,并发标记,重新标记,并发清理,并发重置。由CMS的5个阶段可知,仍然有两个阶段需要STW,所以CMS并不是完全并发,而是Mostly Concurrent Mark Sweep,G1出来之前,CMS绝对是OLTP系统标配的垃圾回收器。

  • FullGC:有些地方称之为Major GC,Major GC通常是跟FullGC是等价的,都是收集整个GC堆。但因为HotSpot VM发展了这么多年,外界对各种名词的解读已经完全混乱了,当有人说“Major GC”的时候一定要问清楚他想要指的是上面的FullGC还是OldGC(参考R大的Major GC和Full GC的区别:https://www.zhihu.com/question/41922036/answer/93079526)。大家普遍对这个GC的误解绝对是最大的(我可以说至少有80%的人都有误解),首先对于ParallelOldGC即默认GC在Old满了以后触发的FullGC是没有问题的,jstat命令查看输出结果FGC的值也会相应的+1,即发生了一次FGC。FGC误解主要来自最常用的ParNew+CMS组合,很多人误解FullGC可能是受到jstat命令结果的影响,因为发生CMS GC时,FGC也会增大(但是会+2,这是因为CMS GC的初始化标记和重新标记都会完全的STW,从而FGC的值会+2)。但是,事实上这并没有发生FullGC。jstat命令结果中的FGC并不表示就一定发生了FullGC,很有可能只是发生了CMS GC而已。事实上,FullGC的触发条件非常苛刻,判断是否发生了FullGC最好的方法是通过GC日志,日志中如果有"full gc"的字样,就表示一定发生了Full GC。所以强烈建议生产环境开启GC日志,它的价值远大于它对性能的影响(不用权衡这个影响有多大,开启就对了)。

关于CMS的foreground collect模式,以及FullGC:

  • foreground collect

它发生的场景,比如业务线程请求分配内存,但是内存不够了,于是可能触发一次CMS GC,这个过程就必须要等待内存分配成功后线程才能继续往下面走,因此整个过程必须STW,因此这种CMS GC整个过程都是暂停应用的,但是为了提高效率,它并不是每个阶段都会走的,只走其中一些阶段,这些省下来的阶段主要是并行阶段:Precleaning、AbortablePreclean,Resizing这几个阶段都不会经历,但不管怎么说如果走了类似foreground这种CMS GC,那么整个过程业务线程都是不可用的,效率会影响挺大。相关源码可以在openjdk的concurrentMarkSweepGeneration.cpp中找到:

void CMSCollector::collect_in_foreground(bool clear_all_soft_refs, GCCause::Cause cause) {
    ... ...

    switch (_collectorState) {
      case InitialMarking:
        register_foreground_gc_start(cause);
        init_mark_was_synchronous = true;  // fact to be exploited in re-mark
        checkpointRootsInitial(false);
        assert(_collectorState == Marking, "Collector state should have changed"
          " within checkpointRootsInitial()");
        break;
      case Marking:
        // initial marking in checkpointRootsInitialWork has been completed
        if (VerifyDuringGC &&
            GenCollectedHeap::heap()->total_collections() >= VerifyGCStartAt) {
          Universe::verify("Verify before initial mark: ");
        }
        {
          bool res = markFromRoots(false);
          assert(res && _collectorState == FinalMarking, "Collector state should "
            "have changed");
          break;
        }
      case FinalMarking:
        if (VerifyDuringGC &&
            GenCollectedHeap::heap()->total_collections() >= VerifyGCStartAt) {
          Universe::verify("Verify before re-mark: ");
        }
        checkpointRootsFinal(false, clear_all_soft_refs,
                             init_mark_was_synchronous);
        assert(_collectorState == Sweeping, "Collector state should not "
          "have changed within checkpointRootsFinal()");
        break;
      case Sweeping:
        // final marking in checkpointRootsFinal has been completed
        if (VerifyDuringGC &&
            GenCollectedHeap::heap()->total_collections() >= VerifyGCStartAt) {
          Universe::verify("Verify before sweep: ");
        }
        sweep(false);
        assert(_collectorState == Resizing, "Incorrect state");
        break;
      case Resizing: {
        // Sweeping has been completed; the actual resize in this case
        // is done separately; nothing to be done in this state.
        _collectorState = Resetting;
        break;
      }
      case Resetting:
        // The heap has been resized.
        if (VerifyDuringGC &&
            GenCollectedHeap::heap()->total_collections() >= VerifyGCStartAt) {
          Universe::verify("Verify before reset: ");
        }
        save_heap_summary();
        reset(false);
        assert(_collectorState == Idling, "Collector state should "
          "have changed");
        break;
      case Precleaning:
      case AbortablePreclean:
        // Elide the preclean phase
        _collectorState = FinalMarking;
        break;
      default:
        ShouldNotReachHere();
    }
  }
}

 

  • G1下的FullGC

G1或者ParNew+CMS组合前提下,如果真的发生FullGC,则是单线程完全STW的回收方式(SerialGC),可以想象性能有多差,如果是es,hbase等需要几十个G的堆,那更是灾难。不过JDK10将对其进行优化,可以参考:http://openjdk.java.net/jeps/307,如下图所示:

JEP 307: Parallel Full GC for G1

后面还有一段描述(Description):
The G1 garbage collector is designed to avoid full collections, but when the concurrent collections can't reclaim memory fast enough a fall back full GC will occur. The current implementation of the full GC for G1 uses a single threaded mark-sweep-compact algorithm. We intend to parallelize the mark-sweep-compact algorithm and use the same number of threads as the Young and Mixed collections do. The number of threads can be controlled by the -XX:ParallelGCThreads option, but this will also affect the number of threads used for Young and Mixed collections.

FullGC触发条件

这里列举一些可能导致FullGC的原因,这也是一些高级面试可能问到的问题:

  • 没有配置 -XX:+DisableExplicitGC情况下System.gc()可能会触发FullGC;

  • Promotion failed;

  • concurrent mode failure;

  • Metaspace Space使用达到MaxMetaspaceSize阈值;

  • 执行jmap -histo:live或者jmap -dump:live;

说明:统计发现之前YGC的平均晋升大小比目前old gen剩余的空间大,触发的是CMS GC;如果配置了CMS,并且Metaspace Space使用量达到MetaspaceSize阈值也是触发CMS GC;

执行jmap -histo:live触发FullGC的gc log如下--关键词Heap Inspection Initiated GC,通过jstat -gccause pid 2s的LGCC列也能看到同样的关键词:

[Full GC (Heap Inspection Initiated GC) 2018-03-29T15:26:51.070+0800: 51.754: [CMS: 82418K->55047K(131072K), 0.3246618 secs] 138712K->55047K(249088K), [Metaspace: 60713K->60713K(1103872K)], 0.3249927 secs] [Times: user=0.32 sys=0.01, real=0.32 secs]

执行jmap -dump:live触发FullGC的gc log如下--关键词Heap Dump Initiated GC,通过jstat -gccause pid 2s的LGCC列也能看到同样的关键词:

[Full GC (Heap Dump Initiated GC) 2018-03-29T15:31:53.825+0800: 354.510: [CMS2018-03-29T15:31:53.825+0800: 354.510: [CMS: 55047K->56358K(131072K), 0.3116120 secs] 84678K->56358K(249088K), [Metaspace: 62153K->62153K(1105920K)], 0.3119138 secs] [Times: user=0.31 sys=0.00, real=0.31 secs]

健康的GC

诊断GC的第一步,当然是知道你的JVM的GC是否正常。那么GC是否正常,首先就要看YoungGC,OldGC和FullGC是否正常;无论是定位YoungGC,OldGC,FullGC哪一种GC,判断其是否正常主要从两个维度:GC频率和STW时间;要得到这两个维度的值,我们需要知道JVM运行了多久,执行如下命令即可:

ps -p pid -o etime

运行结果参考如下,表示这个JVM运行了24天16个小时37分35秒,如果JVM运行时间没有超过一天,执行结果类似这样"16:37:35":

[afei@ubuntu ~]$ ps -p 11864 -o etime
    ELAPSED
24-16:37:35

那么怎样的GC频率和STW时间才算是正常呢?这里以我以前开发过的一个读多写少的dubbo服务作为参考,该dubbo服务基本情况如下:

  • 日调用量1亿+次,接口平均响应时间8ms以内

  • 4个JVM

  • 每个JVM设置Xmx和Xms为4G并且Xmn1G

  • 4核CPU + 8G内存服务器

  • JDK7

  • AWS云服务器

GC统计信息

如下一些信息:

  1. JVM运行总时间为7293378秒(80*24*3600+9*3600+56*60+18)

  2. YoungGC频率为2秒/次(7293378/3397184,jstat结果中YGC列的值)

  3. CMS GC频率为9天/次(因为FGC列的值为18,即最多发生9次CMS GC,所以CMS GC频率为80/9≈9天/次)

  4. 每次YoungGC的时间为6ms(通过YGCT/YGC计算得出)

  5. FullGC几乎没有(JVM总计运行80天,FGC才18,即使是18次FullGC,FullGC频率也才4.5天/次,更何况实际上FGC=18肯定包含了若干次CMS GC)

如果要清楚的统计CMS GC和FullGC的次数,只能通过GC日志了。

根据上面的GC情况,给个可参考的健康的GC状况:

  1. YoungGC频率不超过2秒/次;

  2. CMS GC频率不超过1天/次;

  3. 每次YoungGC的时间不超过15ms;

  4. FullGC频率尽可能完全杜绝;

说明:这里只是参考,不是绝对,不能说这个GC状况有多好,起码横向对比业务规模,以及服务器规格,你的GC状况不能与笔者的dubbo服务有明显的差距。

了解GC健康时候的样子,那么接下来把脉你的JVM GC,看看是有疾在腠理,还是在肌肤,还是在肠胃,甚至已经在骨髓,病入膏肓没救了;

YGC

YGC是最频繁发生的,发生的概率是OldGC和FullGC的的10倍,100倍,甚至1000倍。同时YoungGC的问题也是最难定位的。这里给出YGC定位三板斧(都是踩过坑):

  1. 查看服务器SWAP&IO情况,如果服务器发生SWAP,会严重拖慢GC效率,导致STW时间异常长,拉长接口响应时间,从而影响用户体验(推荐神器sar,yum install sysstat即可,想了解该命令,请搜索"linux sar");

  2. 查看StringTable情况(请参考:探索StringTable提升YGC性能)

  3. 排查每次YGC后幸存对象大小(JVM模型基于分配的对象朝生夕死的假设设计,如果每次YGC后幸存对象较大,可能存在问题)

  4. 未完待续……(可以在留言中分享你的idea)

排查每次YGC后幸存对象大小可通过GC日志中发生YGC的日志计算得出,例如下面两行GC日志,第二次YGC相比第一次YGC,整个Heap并没有增长(都是647K),说明回收效果非常理想:

2017-11-28T10:22:57.332+0800: [GC (Allocation Failure) 2017-11-28T10:22:57.332+0800: [ParNew: 7974K->0K(9216K), 0.0016636 secs] 7974K->647K(19456K), 0.0016865 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
2017-11-28T10:22:57.334+0800: [GC (Allocation Failure) 2017-11-28T10:22:57.334+0800: [ParNew: 7318K->0K(9216K), 0.0002355 secs] 7965K->647K(19456K), 0.0002742 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

再看下面两行GC日志,第二次YGC相比第一次YGC,整个Heap从2707K增长到了4743K,说明回收效果不太理想,如果每次YGC时发现好几十M甚至上百M的对象幸存,那么可能需要着手排查了:

2017-11-28T10:26:41.890+0800: [GC (Allocation Failure) 2017-11-28T10:26:41.890+0800: [ParNew: 7783K->657K(9216K), 0.0013021 secs] 7783K->2707K(19456K), 0.0013416 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
2017-11-28T10:26:41.892+0800: [GC (Allocation Failure) 2017-11-28T10:26:41.892+0800: [ParNew: 7982K->0K(9216K), 0.0018354 secs] 10032K->4743K(19456K), 0.0018536 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

可参考的健康的GC状况给出建议YGC频率不超过2秒/次,经验值2秒~10秒/次都是比较合理的YGC频率;

  • 如果YGC频率远高于这个值,例如20秒/次,30秒/次,甚至60秒/次,这种情况下,说明JVM相当空闲,处于基本上无事可做的状态。建议缩容,减少服务器浪费;

  • 如果YoungGC频率远低于这个值,例如1秒/次,甚至1秒/好多次,这种情况下,JVM相当繁忙,建议follow如下步骤进行初步症断:

  1. 检查Young区,Young区在整个堆占比在25%~40%比较合理,如果Young区太小,建议扩大Xmn。

  2. 检查SurvivorRatio,保持默认值8即可,Eden:S0:S1=8:1:1是一个比较合理的值;

OldGC

上面已经提及:到目前为止HotSpot JVM虚拟机只单独回收Old区的只有CMS GC。触发CMS GC条件比较简单,JVM有一个线程定时扫描Old区,时间间隔可以通过参数-XX:CMSWaitDuration设置(默认就是2s),扫描发现Old区占比超过参数-XX:CMSInitiatingOccupancyFraction设定值(CMS条件下默认为68%),就会触发CMS GC。建议搭配-XX:+UseCMSInitiatingOccupancyOnly参数使用,简化CMS GC触发条件,只有在Old区占比满足-XX:CMSInitiatingOccupancyFraction条件的情况下才触发CMS GC;

可参考的健康的GC状况给出建议CMS GC频率不超过1天/次,如果CMS GC频率1天发生数次,甚至上10次,说明你的GC情况病的不轻了,建议follow如下步骤进行初步症断:

  1. 检查Young区与Old区比值,尽量留60%以上的堆空间给Old区;

  2. 通过jstat查看每次YoungGC后晋升到Old区对象占比,如果发现每次YoungGC后Old区涨好几个百分点,甚至上10个点,说明有大对象,建议dump(参考jmap -dump:format=b,file=app.bin pid)后用MAT分析;

  3. 如果不停的CMS GC,Old区降不下去,建议先执行jmap -histo pid | head -n10 查看TOP10对象分布,如果除了[B和[C,即byte[]和char[],还有其他占比较大的实例,如下图所示中排名第一的Object数组,也可通过dump后用MAT分析问题;

  4. 如果TOP10对象中有StandartSession对象,排查你的业务代码中有没有显示使用HttpSession,例如String id = request.getSession().getId();,一般的OLTP系统都是无状态的,几乎不会使用HttpSession,且HttpSession的的生命周期很长,会加快Old区增长速度;

异常的大对象.png

笔者曾经帮一位朋友排查过一个问题:他也是TOP对象中有StandartSession对象,并且占比较大,后面让他排查发现在接口中使用了HttpSession生成一个唯一ID,让他改成用UUID就解决了OldGC频繁的问题。

FullGC

如果配置CMS,由于CMS采用标记清理算法,会有内存碎片的问题,推荐配置一个查看内存碎片程度的JVM参数:PrintFLSStatistics。

如果配置ParallelOldGC,那么每次Old区满后,会触发FullGC,如果FullGC频率过高,也可以通过上面OldGC提及的排查方法;

如果没有配置-XX:+DisableExplicitGC,即没有屏蔽System.gc()触发FullGC,那么可以通过排查GC日志中有System字样判断是否由System.gc()触发,日志样本如下:

558082.666: [Full GC (System) [PSYoungGen: 368K->0K(42112K)] [PSOldGen: 36485K->32282K(87424K)] 36853K->32282K(129536K) [PSPermGen: 34270K->34252K(196608K)], 0.2997530 secs]

或者通过jstat -gccause pid 2s pid判定,LGCC表示最近一次GC原因,如果为System.gc,表示由System.gc()触发,GCC表示当前GC原因,如果当前没有GC,那么就是No GC:

System.gc引起的FullGC

飞书应用开发脚手架lark-harness:从零构建企业级机器人 在构建企业级应用时,开发脚手架是提升工程效率和规范性的关键工具。其核心原理在于通过预设的项目模板、最佳实践和通用模块封装,自动化处理项目初始化、配置管理和基础架构搭建。这种技术价值在于将开发者从重复性劳动中解放出来,确保团队技术栈统一,并降低维护成本。在Node.js生态中,脚手架常与Express或Koa等Web框架结合,用于快速构建Web服务、API接口和实时事件处理系统。具体到飞书开放平台开发场景,开发者需要处理OAuth 2.0授权、事件订阅验证、消息加解密等复杂且标准的流程。lark-harnes 阅读详情

相关推荐

ScanNet数据集下载全攻略:从申请到解析的保姆级教程(含常见问题解决)

本文提供了ScanNet数据集从申请授权到下载、解析的完整实战指南。针对这个大规模室内RGB-D数据集,详细介绍了官方申请流程、优化下载策略、数据验证方法,并重点解决了深度图解析等常见问题,帮助三维视觉研究者高效获取和使用这一宝贵资源。

5f4d3s2a1q的博客 617

JVM-jstat

1、jstat -gccause PID 查看当前jvm的GC情况 2、jstat -gccause PID 2s 3 每隔2s输出当前jvm的GC情况,总共输出3次,主要查询使用空间百分比 下面对返回的参数做了详解 S0 — Heap上的 Survivor space 0 区已使用空间的百分比      S1 — Heap上的 Survivor space 1 区已使用空间的百...

Javap 指令集 1305

3D医学影像分割实战:从数据预处理到模型训练全流程解析

本文详细解析了3D医学影像分割的全流程,从数据预处理到模型训练,重点介绍了nnUNet框架的应用技巧。通过实战案例,帮助开发者掌握如何处理复杂的.nii.gz文件格式、优化数据预处理流程以及高效训练3D分割模型,特别适合医学影像分析领域的从业者参考。

weixin_29098367的博客 222

JVM调优--经验总结

本文介绍JVM调优的一些常用经验。

IT利刃出鞘的博客 5431

液晶电视维修必看:TCON逻辑板故障排查全指南(附常见问题解决方案)

本文详细解析了液晶电视TCON逻辑板的工作原理与故障排查方法,涵盖LVDS信号处理、DC-DC电压系统等核心知识。提供从基础测量到高级维修的完整指南,帮助技术人员快速诊断黑屏、竖线等常见故障,并给出预防性维护建议,提升维修效率与成功率。

weixin_42535461的博客 614

STM32H750实战:用TIM+DMA驱动ADC/DAC实现音频回环(附CubeMX配置避坑指南)

本文详细介绍了在STM32H750上构建高保真、低延迟音频链路的实战方法。通过配置TIM定时器作为硬件节拍器,精准触发ADC采集与DAC播放,并利用DMA实现数据的自动搬运,全程无需CPU干预。文章重点剖析了CubeMX配置中的关键步骤与常见“坑点”,如ADC的Conversion Data Management模式选择、DMA的FIFO与Burst模式配置,以及STM32H7系列必须开启ADC全局中断等,并提供了完整的代码实现与调试验证指南。

1057

JVM垃圾回收和调优实践

JVM垃圾回收 YGC、OldGC、FullGC区别和联系 区别 YGC ->Minor GG:发生在年轻代的GC OldGC -> Major GC:发生在老年代的GC FullGC -> Full GC:发生在年轻代、老年代、方法区的GC(方法区VS持久代:方法区是JVM规范,持久代是方法区的实现,jdk8后方法区由本地内存实现) ​ ...

jiangqingqingqing的专栏 1185

PSM-DID实战指南:Stata代码解析与案例应用

本文详细解析PSM-DID方法在Stata中的实战应用,从理论到代码实现全面覆盖。通过倾向得分匹配(PSM)和双重差分(DID)的结合,有效解决政策评估中的选择偏差问题。文章提供完整的Stata命令代码、样例数据处理技巧和案例应用,帮助研究者准确评估政策效果。

vulkan6gpu的博客 791

java ygc_jvm之判断ygc耗时和频率

首先明确所有分析的java应用的进程编号,然后在根据进程编号获取gc信息和运行时长,最后计算ygc的平均耗时和Step1、找出所查java应用的进程编号jps -mlv | grep 应用名称 # 或者 ps -ef | grep 应用名称20848 com.lqz.test.Main -Dprogram=APP_/home/lqz/test/bin/.. -Xms4G -Xmx4GStep2、查...

weixin_35943493的博客 1306

COMSOL有限元仿真深度指南:连接薄结构与实体结构(I)

COMSOL有限元仿真深度指南:如何在结构力学仿真中连接薄结构与实体结构?

忘了面孔的Batou 1万+

SAP 系统间信任关系配置全攻略:从 SM59 到 SMT1 的实践与风险控制

本文介绍了在SAP系统间配置信任关系的详细流程与最佳实践。文章以SAP Gateway与后端系统架构为场景,从SM59创建RFC目的地开始,到SMT1建立信任关系,再到授权对象S_RFCACL的配置,提供了完整的操作指南。重点包括:使用标准命名规范创建专用RFC连接、通过向导完成系统间信任登记、严格控制S_RFCACL授权范围等。文中还分享了真实项目案例、可复用的检查清单以及常见问题的排查思路,帮助用户实现稳定可靠的跨系统无密码调用,同时确保安全性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 321

GC调优经验

YGC是最频繁发生的,发生的概率是OldGC和FullGC的的10倍,100倍,甚至1000倍。同时YoungGC的问题也是最难定位的。这里给出YGC定位三板斧: 查看服务器SWAP&IO情况,如果服务器发生SWAP,会严重拖慢GC效率,导致STW时间异常长,拉长接口响应时间,从而影响用户体验(推荐sar工具); 查看StringTable情况(请参考:探索StringTable提升YGC性能) 排查每次YGC后幸存对象大小(JVM模型基于分配的对象朝生夕死的假设设计,如果每次YGC后幸存对象较

ZERO 1101

SOEM主站开发篇(1):移植SOEM主站到Linux开发板

详细介绍了SOEM主站源码移植到Linux开发板上的步骤,同时演示了如何使用Linux开发板获取EtherCAT从站的PDO映射信息。

kevin1499的博客 2396

记一次阿里巴巴面试被虐和一些电面问题

首先,个人来自一所双非学校,能够接到阿里巴巴的面试电话,我感到万分荣幸和激动。面试官很好,也让我感受到阿里确实是一个注重个人素养,情怀和能力的公司,而不是特别注重学校的公司,如果我没能通过面试,那确实是自己能力不足。面试被虐到不行,基本都知道,只是一知半解,也让我知道了,自己跟其他人的能力差距,感谢阿里。 下面是我记得的面试问题: 1、自我介绍 2、jvm的组成 3、介绍下老年代和新生代,按照什么...

不言不扰 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

好不容易面试阿里巴巴,面试官怎么不按套路出牌啊

前言: 由于我在自我介绍时提到应聘的是Java岗,因此面试官直接抛出问题:“你对Java这门语言了解的深度是多少”,“是否看过JDK的源码”(当场傻眼…)。如果回答看过,好,进坑了,因为面试官会继续追问:“那来说一下都看过哪部分”(大型懵逼现场)。卡壳了,好,引导来了,“比如Java的集合有看过吗”,于是大胆引出HashMap。好,又进坑了,“那咱们聊一下HashMap,首先说一下它的原理吧,它是以一种什么样的数据结构来实现的”。 面试过程: 电话面试,大约30分钟-技术面 晚上突然接到电话面试,面

banzhuanhu的博客 2632

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

阿里巴巴面试官耗时500小时整理出这些Java面试经验,纯面试干货

作为一名优秀的程序员,技术面试是不可避免的一个环节,一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 如果你参加过一些大厂面试,肯定会遇到一些这样的问题: 1、看你项目都用的框架,熟悉 Spring、mybatis 等框架实现原理吗? 2、 看你上面有接触过消息中间件,负载均衡、RPC 框架等技术吗,MySQL 分库分表有做过吗? 3、 分布式架构设计,Redis 分布式锁呢?

jcc4261的博客 1503

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

记录一次壮烈牺牲的阿里巴巴面试

相关阅读:BAT等大厂十年研发经历,总结了12开发条经验(墙裂推荐)10种常见的软件架构模式互联网技术(java框架、分布式、集群)干货视频大全,不看后悔!(免费下载)今...

emprere的博客 2521

Java程序员:因为不太了解JVM,面试官让我先回去等通知...

群里一小伙伴抱着侥幸心里,投了阿里简历,本来不抱什么希望,意外中收到了蚂蚁的面试通知,对这哥们来说,简直“受宠若惊”。不过,他心态比较好,不管能不能最终拿到 offer,能有一次大厂的面试机会,看看和别人的差距,也是极好的。第一轮的电面,问的问题都蛮基础,无非是多线程、死锁、缓存等问题,每个大块里面的问题也是按照顺序问的,但都是那种步步深入,连环炮似得发问,直到摸到你的底。听...

weixin_33831196的博客 179

阿里巴巴2014研发工程师实习生面试经历

2014阿里巴巴北京站研发工程师的实习二面的面试经验,附带一面的题目。

Stay Foolish 9633

阿里巴巴菜鸟网络面试经历

2019年2月中旬的时候,在boss直聘上无意间看到了阿里巴巴菜鸟网络的招聘信息,现在的部门已经有两名同学被蚂蚁金服录取了,自己就不服气的也想试试。这次面试其实并没有准备充分,之前就听说总共有很多轮数,不仅会考察基础知识的深度,也会考察算法能力、项目设计能力、价值观世界观等。自己抱着能走多远走多远的态度,挑战一下自己。 在发过去简历的一周后,大概是2月28号左右,一面的小哥哥下午打来电话约我2...

wushuangshixinqiu的博客 1万+

字节跳动,华为,阿里巴巴,小米,腾讯2024大厂面试经历系列之(面试题篇)

(帅张)stormzhang 跟你谈一下面试那些事儿面试时企业最看中你什么能力?我面试到底问什么?Android 面试那些事儿。

2501_90433289的博客 2104

【走进大厂面试系列】大厂面试官眼中的好简历到底长啥样

小小简历,大大天地,如何将简历写到面试官心坎里。

4025

某平台百万阅读博主,去面试阿里P7,遭面试官狂喷:根本不懂技术,闭关60天,吊打曾经面试官,史上最强

某平台百万阅读博主,去面试阿里P7,遭面试官狂喷:根本不懂技术 一气之下回家硬肝60天,再战阿里又遇到当初面试官!轻松拿下阿里P7后说出实情,竟只是凭借这个文档! 首先声明: 本书覆盖了近3年程序员面试笔试中超过98%Java高频知识点当你细细品读完本书后,各类企业的offer将任由你挑选 一书在手/工作不愁 记住重点,考试要考,需要或者这份覆盖近3年98%的高频面试笔试题的小伙伴可以直接转发+关注后私信”(学习)即可免费获取! 前言 程序员求职始终是当前社会的一个热点,而市面上.

代码界的扛把子 2732

面试阿里巴巴有多难,看看面经你就知道了

目录: 01 面试经验分享(阿里落榜+美团面试题) 02 面试美团,应该具备什么样的能力? 03 如何快速提升自己,通过面试? 写在开头 成长背景: 先说一下个人的一个成长背景吧。出身江南小镇,大学没有出省,毕业之后就去了上海,在一家互联网金融工作,到去年年底整整两个年头。辞职之后运气不太好,碰到疫情肆虐,现在快步入3月月末了,实际上早早就已经在面试了,截止目前的结果,三面阿里已经“落榜”,后来拿到了一个内推的机会,4面揽下了美团offer。 面试感受: 这次面试下来,给我的感受只有一个,大厂

m0_65751271的博客 3440

阿里巴巴——三面,面试经历记录

在 boss 直聘上无意间看到了阿里巴巴菜鸟网络的招聘信息,现在的部门已经有两名同学被蚂蚁金服录取了,自己就不服气的也想试试。这次面试其实并没有准备充分。 之前就听说总共有很多轮数,不仅会考察基础知识的深度,也会考察算法能力、项目设计能力、价值观世界观等。 自己抱着能走多远走多远的态度,挑战一下自己。 在发过去简历的一周后,大概是2月28号左右,一面的小哥哥下午打来电话约我2月28号晚上9点钟面试。 结果在 2 月 29 白天的时候,我基本上都没有怎么工作,而是把我平时积累的一些基础知识总结了一下,

bjmsb0051的博客 2158

阿里巴巴-菜鸟网络和申通快递面试

开头的话 今年无意中给菜鸟网络投了简历,本来觉得应该没啥机会,突然有一天收到邮件,告诉我阿里一位帅哥(肯定是)推荐我应聘菜鸟网络的职位,让我等待面试,很开心,于是我在工作之余开始准备面试。 过了五六天、下午三四点突然接到一个电话,问我可不可以开始面试。当时我手上的活已经做完了,就毅然决然的答应了 一面 1、讲一讲Resource和Autowired的区别 2、熟悉hashmap吗?它的数据结构是什...

南橘Home 4114
上一篇: 13 个最火的 Java 开源项目推荐!总有一个适合你!
下一篇: Spring Boot 密码加密的 2 种姿势!
msbjyJava
博客等级 码龄6年 5粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值