java类面试题哪里有哦?
程序员面试分两部分,理论和编程。
准备理论面试的时候,有一份调理清晰的面试题目是很有帮助的,所以我自己也在做一系列的视频,就是针对面试题目的,不过还在整理录制当中,有兴趣可以关注我。如果现在急用,可以到这里看一下:。
至于编程练习,leetcode是首选,只是现在leetcode不是所以的东西都免费了。我同时也在定期录制编程训练的视频,希望之后可以帮到更多的朋友。
JVM老年代内存突然飚高,是怎么回事?
能定位到是JVM老年代内存飙高,说明题主对JVM有了一定认识并且可能对JVM分代回收机制也有了解。
因为老年代内存存储对象是新生代中通过多次mingc都没有被释放掉的对象(或者age达到一定值或者新生代内存告急,导致频繁mingc,GC的同时引发majGC)
我就简单说一下在什么情况下可能产生老年代内存突然飙高以及其原因:
可能原因
- 死循环中不断创建对象,导致Eden区内存爆满引起mingc,同时因为依然存在引用+新生代内存空间不足引起频繁mingc进而age快速增大然后被放入老年代中,使得老年代内存飙升。当然飙升一次最多也就是新生代的内存也就是1/3。
- 载入大批量对象。这个大概率是从DB中获取数据时未限制返回条数或者返回条数设置失效导致一个查询导致内存暴增,引起连锁反应如上。
- 业务逻辑新增众多静态引用对象或者类引用(这个往往是外行或者新手或者一些理论还不错的坑爹领导写的代码)。
- JVM分代内存大小比例设置和当前业务需求不匹配,可能项目业务需求已启动就需要50M内存空间而你只为新生代设置了60M内存空间。
解决方式
通过linux top和jmap -histo:live [pid] 命令快速定位大内存代码块。不清楚的可以百度或者私信,手把手教会。
合理分配JVM堆内存分代比例。可以通过简单计算获取服务器启动所需内存,再通过一定比例设置。这个比例大致相同但是也可能根据项目特色发生比较大的变化。比如老年代:新生代=2:1,Eden:A:B=8:1:1。这些都是可以调整的。