「美团java进程」美团面经Java

博主:adminadmin 2022-12-21 20:12:11 70

今天给各位分享美团java进程的知识,其中也会对美团面经Java进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

G1 GC垃圾收集流程

从 GC 算法的角度,G1 选择的是复合算法,可以简化理解为:

YoungGC 触发时机

在分配一般对象(非巨型对象)时,当所有 eden region 使用达到最大阀值并且无法申请足够内存时,会触发一次YoungGC。每次young gc会回收所有Eden以及Survivor区,并且将存活对象复制到Old区以及另一部分的Survivor区。因为YoungGC会进行根扫描,所以会 stop the world 。

YoungGC的回收过程如下 :

1.根扫描root scan,跟CMS类似, Stop the world ,扫描GC Roots对象。

2.处理Dirty card,更新RSet.

3.扫描RSet,扫描RSet中所有old区对扫描到的young区或者survivor去的引用。

4.拷贝扫描出的存活的对象到survivor2/old区

5.处理引用队列,软引用,弱引用,虚引用

值得高兴的情况是, cleanup 可以释放老年代的整个regions. 但是并不是每次都是这样, 当并发标记成功结束后,G1会预定一个混合的收集来收集年轻代regions的垃圾,也会在收集集合中加入一部分老年代的regions.

一个混合的Evacuation Pause并不总是并发标记阶段结束后立即开始. 有一系列的规则和启发式算法来决定这个. 比如, 可以释放掉老年代的一大部分空间, 那么就没必要做这个了.

因此,就是在并发标记结束和混合Evacuation Pause之间加入很多fully-young的Evacuation Pause.

具体放入收集集合的老年代区的region,以及它们被加入的顺序都基于一系列的规则选择出来的. 这些规则包括:应用设定的软的实时性能指标, 存活统计以及并发标记阶段垃圾回收的效率, 还有一系列可配的JVM 选项. 混合式收集大体上与我们前面看到fully-young相同, 但这次我们讲到新的对象 remembered sets .

remembered sets 用来支持在不同heap regions上的独立收集. 比如当收集region A,B,C, 我们只需要知道从region D和E中是否有引用到它们来决定它们的存活性.因为遍历整个堆会消耗很久的时间并且打破了我们增量收集的意义, 所以在G1中也采用了与在其他算法中采用Card Table来独立收集年轻代区域类似的优化算法, 叫做remember sets.

如下图所示, 每个region都有一个RSet保存从其他region到这个region中对象的引用. 这些对象会被当做额外的GC roots. 注意在并发标记阶段, 老年代被认为是垃圾的对象会被忽略, 即便有外部对象还在引用它们, 因为它们的对象也会被当做垃圾.

接下来发生的与其他收集器类似:多个并行的GC线程会找出哪些是存活的哪些是垃圾. 最后, 所有存活对象会被移动到survivor区(如有必要创建新的).所有的空region会被释放后被用来存放对象. [[图片上传失败.

为了在应用程序运行期间维护RSets, 任何时候对域的更新都会触发一个Post-Write屏障. 如果关联的引用是跨region的, 比如从一个region到另一个region,一个对应的记录也会在目标region的RSet中添加. 将记录(cards)加入到RSet是异步的并应用了很多优化.简单来说它用Write屏障来将脏记录放到本地buffer中, 一个特殊的GC线程会选择这些记录,然后传播信息给其他region的RSet.

Young GC发生的时机大家都知道,那什么时候发生Mixed GC呢?其实是由一些参数控制着的,另外也控制着哪些老年代Region会被选入CSet。

gc_handbook_zh

第一阶段initial mark是共用了Young GC的暂停,这是因为他们可以复用root scan操作,所以可以说global concurrent marking是伴随Young GC而发生的。

第四阶段Cleanup只是回收了没有 任何存活对象的Region ,所以它并不需要STW

图是来自 oracle 上对 gc 周期的描述,实心圆都表示一次 GC 停顿

除了以上的参数,G1 GC相关的其他主要的参数有:

参数 含义

-XX:G1HeapRegionSize=n 设置Region大小,并非最终值

-XX:MaxGCPauseMillis 设置G1收集过程目标时间,默认值200ms,不是硬性条件

-XX:G1NewSizePercent 新生代最小值,默认值5%

-XX:G1MaxNewSizePercent 新生代最大值,默认值60%

-XX:ParallelGCThreads STW期间,并行GC线程数

-XX:ConcGCThreads=n 并发标记阶段,并行执行的线程数

-XX:InitiatingHeapOccupancyPercent 设置触发标记周期的 Java 堆占用率阈值。默认值是45%。这里的java堆占比指的是non_young_capacity_bytes,包括old+humongous

-XX:G1ReservePercent,通过-XX:G1ReservePercent指定G1为分配担保预留的空间比例,默认10%。也就是老年代会预留10%的空间来给新生代的对象晋升,如果经常发生新生代晋升失败而导致Full GC,那么可以适当调高此阈值。但是调高此值同时也意味着降低了老年代的实际可用空间

-XX:G1HeapWastePercent

通过-XX:G1HeapWastePercent指定触发Mixed GC的堆垃圾占比,默认值5%,也就是在全局标记结束后能够统计出所有Cset内可被回收的垃圾占整对的比例值,如果超过5%,那么就会触发之后的多轮Mixed GC,如果不超过,那么会在之后的某次Young GC中重新执行全局并发标记。可以尝试适当的调高此阈值,能够适当的降低Mixed GC的频率

其他参数

因此AlwaysPreTouch,JVM就会先访问所有分配给它的内存,让操作系统把内存真正的分配给JVM.后续JVM就可以顺畅的访问内存了

关于AlwaysPreTouch找了一些资料,这个参数属于比较偏门的优化项

JAVA进程启动的时候,虽然我们可以为 JVM 指定合适的内存大小,但是这些内存操作系统并没有真正的分配给JVM,而是等JVM访问这些内存的时候,才真正分配,这样会造成以下问题:

配置-XX:+AlwaysPreTouch参数可以优化这个问题,不过这个参数也有副作用,它会影响启动时间,那影响到底有多大呢?请接着往下看。

配置这个参数后这么耗时其中一个原因是,这个特性在JDK8版本以前都不是并行处理的,到了JDK9才是并行。可以戳链接Parallelize Memory Pretouch:

配置-XX:+AlwaysPreTouch参数后,JVM进程启动时间慢了几个数量级的根本原因呢?

在没有配置-XX:+AlwaysPreTouch参数即默认情况下,JVM参数-Xms申明的堆只是在虚拟内存中分配,而不是在物理内存中分配:它被以一种内部数据结构的形式记录,从而避免被其他进程使用这些内存。这些内存页直到被访问时,才会在物理内存中分配。当JVM需要内存的时候,操作系统将根据需要分配内存页。

配置-XX:+AlwaysPreTouch参数后,JVM将-Xms指定的堆内存中每个字节都写入’0’,这样的话,除了在虚拟内存中以内部数据结构保留之外,还会在物理内存中分配。并且由于touch这个行为是单线程的,因此它将会让JVM进程启动变慢。所以,要么选择减少接下来对每个缓存页的第一次访问时间,要么选择减少JVM进程启动时间,这是一种trade-off。

在某些情况下,G1触发了Full GC,这时G1会退化使用Serial收集器来完成垃圾的清理工作,它仅仅使用单线程来完成GC工作,GC暂停时间将达到秒级别的。整个应用处于假死状态,不能处理任何请求,我们的程序当然不希望看到这些。那么发生Full GC的情况有哪些呢?

并发模式失败

G1启动标记周期,但在Mix GC之前,老年代就被填满,这时候G1会放弃标记周期。这种情形下,需要增加堆大小,或者调整周期(例如增加线程数-XX:ConcGCThreads等)。

晋升失败或者疏散失败

G1在进行GC的时候没有足够的内存供存活对象或晋升对象使用,由此触发了Full GC。可以在日志中看到(to-space exhausted)或者(to-space overflow)。解决这种问题的方式是:

巨型对象分配失败

当巨型对象找不到合适的空间进行分配时,就会启动Full GC,来释放空间。这种情况下,应该避免分配大量的巨型对象,增加内存或者增大-XX:G1HeapRegionSize,使巨型对象不再是巨型对象。

参考

分享文档

Java Hotspot G1 GC的一些关键技术- 美团

Plumbr Handbook Java Garbage Collection.pdf 翻译

G1GC 概念与性能调优- oppo

hbase G1

美团前端面试难吗

美团目前也是在大量的招人啊~~当时参加的是美团打车部门的面试(一年工作经验以上的),部门技术栈vue,后台就是node,一面通过,等了两个小时面试二面,然后通知我回去等消息,一般这样就是挂掉了,毫无疑问。美团是一次性全部面完的。所以去参加最好做好面试四个小时的打算。

先来聊聊一面吧~哈哈

一面

1.简单的自我介绍,与大体的了解我。。。

一面面试官非常不错,先问了下几个项目和用到的技术,会先对我懂的东西做一个大体的了解,比如webpack的单页面的多页面切换,webpack的按需加载,一些webpack的配置有哪些,问了有没有看vue源码,我说了一个vue的watch,大体问了问我框架方面的东西,发现我对框架并不是很熟练,安慰我说没有关系。

2.promise的原理

这个面试官最让人欣赏的就是不会去问你不了解的东西,一开问了我promise,发现我用的并不是很多,就很自然的说没事,换一种方法问你~~~好和蔼啊~

然后就让我用原生js写一个回调函数,其实就是问promise的原理了,js写一个。

3.this指向

这个是面试官手写了一道变态长以及绕的this指向题,可以自行百度js this指向面试题,看几道没有啥问题,需要关注的是其中也考了,argument,和apply(null)。以后想起来再写吧

4.bind与函数柯里化

也就是写个bind,这个红皮书高级函数(22章)有,

可以看下。不过还是得先理解bind的用法,返回一个函数,以及可以传递的参数。参数这里涉及到了函数柯里化。都是手写代码,而且最好写的整洁,因为我有些一笔带过,面试官都让我写完整,明确说要看我写代码水平

5.==, isNaN, typeof

问这个之前先问了我有几种数据类型(七种,下图再加symbol),这里隐形的看你知不知道es6,symbol这个新出的类型。说出了symbol自然会问你这个类型有什么用。

然后就写了好多个typeof,isNaN,==的问输出,这个就是基础题

6.知道什么http请求头?

这个可以说的很多,说了几个,又主动说了下有关跨域请求头,之前项目用的cors,于是和他聊了一会,其实面试就是主动表现自己,把自己知道的都说出来,不然几个请求头说细不细,要问细了能把人问蒙了,最好把话题引到自己知道的地方。

7.问了css

问了css盒子并画出来,清除浮动与bfc,两列布局。

8.说了一大堆其实就是想考我防抖

面试完这个问我想问的问题,我直接问还有二面么?回答有的,又介绍了一会美团打车,说是后台是node,看来要求是前端也要有后台的知识喽。

二面

二面的是我的学长,可是我被问惨了。。。。问的显然比一面深入很多,都问了java

1.自我介绍,问项目

针对项目问了不少,当时有一个支付行为的项目,于是问了很多安全方面的问题,蒙蒙的,完全不知道。第一个就很失败了。然后问了其他的项目,问了websocket。

2.node的EventEmitter用js实现出来

写出来了,但是可以看出来代码写的不规范,学长面试官表示看起来很乱。不过大约算是可以的,指出了几个问题,让我进行修改。(之后完善)

3.虚拟dom

其实vue中就有jsx,react的特点之一有jsx,虚拟dom和代码优化有点关系。

先说下正常对dom的操作,在浏览器中分为渲染引擎和js引擎,现在浏览器内核一般都是渲染引擎(生成渲染树),因为js引擎越来越独立了(所谓的v8引擎?)

然而你在js中获取dom元素的时候你必须要通过渲染引擎,这样两个线程之间的数据交换自然会很慢。所以在前端优化中总是要考虑减少dom操作这一项。包括获取dom元素变量储存起来。

jsx是把dom元素变成了储存在内存中的数据结构。js很快,操作dom也很快。不过也存在缺点,目前的理解就这么点了。

4.路由的实现原理

饿,不知道。。(待会看!)

5.node文件流,java的映射机制(记不太清楚)?

饿。。

6.数组方法map和reducer区别?

饿

7.进程与线程的区别

终于有个我会的了,这个显然想问你js的运行机制。先介绍了下进程与线程。

一个浏览器是一个进程,虽然js是单线程的,但是浏览器是多线程的,v8引擎也是多线程的,比如有渲染线程,有处理请求的线程。然后说说任务队列,eventloop。没有理解很深也不敢往下说。

事件循环可以看下这个,链接

8.树遍历

先序,中序,后序。我只知道这么多了,显然想让我写一个的,可是不会。也显然面试官内心已经把我pass掉了,没多问。

9.问了个算法

KMP??反正我不知道。

美团卡券核销功能Java后端怎么实现

卡券核销功能(对应老版的微助手)是核销微信平台的卡券二维码如微客巴巴商城订单二维码、大转盘、刮刮卡中奖二维码、优惠券、团购券等。店长可以核销该门店的所有卡券,店员需要找店长开通启用卡券核销功能方可使用。

(五)Android多渠道打包:美团多渠道打包原理以及使用

1.传统打包:

传统的打包方法都是在AndroidManifest添加渠道标示,每打一次包修改一次标示的名称。效率特别的低,一个稍微大一点的项目打上几十个渠道包可能需要几个小时半天的时间。

2.由于传统的打包方式每次修改渠道都需要重新的构建项目,时间都浪费构建上面了,美团提供了一种新的打包方案:

Android应用使用的APK文件就是一个带签名信息的ZIP文件,根据 ZIP文件格式规范,每个ZIP文件的最后都必须有一个叫 Central Directory Record 的部分,这个CDR的最后部分叫”end of central directory record”,这一部分包含一些元数据,它的末尾是ZIP文件的注释。注释包含Comment Length和File Comment两个字段,前者表示注释内容的长度,后者是注释的内容,正确修改这一部分不会对ZIP文件造成破坏,利用这个字段,我们可以添加一些自定义的数据,Packer-Ng方式打包就是在这里添加和读取渠道信息。打包神器,100个渠道包只需5s 哈哈 。

原理很简单,就是将渠道信息存放在APK文件的注释字段中。

第一步:直接将PackerNg作为Utils拷贝到项目中。

第二步:创建一个保存渠道包名的txt文件,可以放在项目主目录下:比如命名market.txt

渠道名可以按照需求随便添加

anzhi

baidu

huawei

legend

letv

meizu

oppo

qq

PC

sougou

UC

update

update1

vivo

wandoujia

woshangdian

xiaomi

第三步:ChannelUtil这个工具类是用于取出文件里的渠道名

第四步:打开第二步中的PackerNg类,首先配置一下此类main函数中接受的参数信息。本事例通过Android Studio的方式进行配置直接上图:

图中标注3的位置就是PackerNg类配置main函数中接受的两个参数: 第一个参数为默认的release包的apk源文件,包名为ChannelUtil起初默认的包名

拿到这个包名可以传给后台进行统计或进行其它的操作。

第六步:运行PackerNg类,会在项目目录下自动生成文件夹apks(在PackerNg.java文件中配置好的apk渠道包存储路径)

注意点:第四步中ChannelUtil起初默认的包名为源文件,其它所有的的渠道包都是通过PackerNg打包方式都是以这个源文件为模版,进行复制,将不同的渠道名复制给这个源文件。如果是360渠道上线的话需要将这个包名默认改为360的渠道单独打包,因为360上线需要加固,会把之前通过源文件复制渠道名给抹掉,所以对于360加固的文件需要单独把360作为源文件来打包不改为360默认的渠道包后会统计不到360渠道的信息。

美团是不是用java写的

服务器端是可能是java,前端是php,Android客户端是java写的,IOS是oc或者swift。另外,百度一下“程序员之路FM”收听我的节目。哈哈。

请问面试美团的正常流程是什么

美团面试主要是分为笔试和面试,美团是分批面的,基本是一次性面完总共三面,全都是技术面的。一面没通过,直接说farewell了。前两面没压力,面试官是和颜悦色;到第三面,能明显感觉到差别,基本面无表情,做好心理准备。面试过程:笔试题目,算法程序题多,最后安卓前端题,题目还是不难的,题目在lintcode上刷到过一样的。第一面:随时Be Nice,一个普通员工就可能是你的面试官;首先做自我介绍。面试官对我的经历问了几个问题,然后就是问些很基础,进程和线程的区别;进程间同步方式,。还问到如何编程实现 a^n ,我就说用二分的思想。说到思想,美团蛮注重思想的,第二第三面过程里如果有什么你一下子难实现的,你就讲清楚你是怎么个思路,不要消极对待就好。然后就是随意提问,问到了Java里面的各种语言机制,问到了计算机网络里面的三次四次握手,UDP和TCP区别,get和post区别等等,没有深问。问的很杂很多。

第二面:基本上是没问操作系统和网络的题目,就出算法题,有如何判断一个二叉树是另一棵二叉树的子树;像打印机一样,倒过来打印一棵树,比如一个树是这样的,输出4、5、6、2、3、1,这个就用层次遍历,存储遍历过的节点,在每一层的结尾存储该层的个数……面试官检查验证代码超级仔细,所以面试过程中做题目的时候还是要更加专心一点,不然被他发现错误. 接着,第二个问题,自己写一个Stack类,要实现push、pop操作。

第三面:面试官基本是Boss级别的吧,各种问题啊,兴趣爱好未来规划啥,了解你这个人的性格和美团契合。三面都是技术面,最后还是要写代码

1)实现 char* upcase(const char* src, int len)。

2) 类似6,7,8,1,2,3,4,5 的序列中用二分查找某个数。他还会问问看过的书啊,问几个简单的问题,能答上来就好。基本是工作要求里提到的名著或者就是教材里学到的东西,因为三面的面试官是大佬,是希望能我们能有积极解决问题热情。

前期准备:对美团注重算法早有耳闻,还是很早就开始准备刷题。面试时笔试和面试里都遇到了在lintcode 做过的原题。总之,面美团算法必要刷,难以实现就用逻辑清晰的思路来拯救面试;在技术都OK前提下,面试官看重的更多是优秀逻辑思维能力,善于从复杂系统表象中分析问题,对解决复杂问题充满激情。不要遇到困难有消极情绪!

关于美团java进程和美团面经Java的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-21,除非注明,否则均为首码项目网原创文章,转载请注明出处。