博主太痛苦了,没有任何资源,一个人奋战着(可能别人家的孩子都有矿吧,嘤嘤嘤),对java面试也没有经验,对面试毫无经验,所以少吃了一餐饭,省下的钱买了份资料,我把它出来, 目的是想给和我一样没有任何资源,同时想在互联网混口饭吃的底层人员一些帮助。 话不多说,下面是正文 我是一名在 IT 行业闯荡了 8 年的程序员,从最初刚毕业时的迷茫到找到一份工作的喜悦,从一个小白慢慢成长为一个行业老兵,从一个初创型的公司到一个几千人的大型互联网公司,从初级程序员到架构师、技术经理,回顾这 8 年来,也有许多可圈可点的地方。 最近几年公司的大小招聘,社招、校招都有参与,面试过许多大牛,也遇到过很多职场小白。有 10 年 工作经验的,也有刚刚毕业来面外包的、担任技术一面的面试官,深知技术面试之重要,来面试的不乏一轮游的,看着有些同学基础浮夸、做着重复的项目也没有任何总结沉淀,自我介绍完全不知道在说啥等等诸如此类的现状,这也让我非常苦恼,面试也很累的,一坐就大半天,聊十几二十个人,如果你还在东拉西扯不知所云,抑或是对面试官问的问题答非所问,基本在面试官心里已经给你 pass 掉了,之所以面试还在持续,只是因为职业素养罢了,为了不让面试者感觉太挫败,毕竟大老远的跑来求职都不容易,但是内心里却已经没有聊下去的欲望了。想想自己也是从那个层次一步步走上来的,也经历了许多坎坷,觉得有必要把我的面试经验跟大家一下,希望能帮助大家找到一份满意的工作。 面试需要有的放矢、机会是留给有准备的人。我相信经过你的努力,一定会有满意的收获。我挑出来面试官常问的知识点给大家有的放矢地强化,有助于快速提高,哪怕是临时抱佛脚也能跟面试官搭上话。 适宜阅读人群: 准备面试的初(中)级 Java 程序员或者面试官 下面开始进入主题。 1. 面向对象的特性有哪些? 封装、继承、多态。 还有一个抽象,问三个就说上面三个,问四个就再补一个抽象 2. Java 中 Override 和 Overload 有什么区别? 追问:什么情况下方法不能被重写? 方法被定义为 3. 抽象类和接口有什么区别? 抽象类: 接口: 追问:什么情况下选择接口,什么情况下选择抽象类? 当要创建不带任何方法定义和成员变量的基类,应该选择接口;当有方法定义和成员变量的时候,应该选择抽象类。 4. JRE、JDK、JVM 有什么区别? 5. 值传递和引用传递有什么区别? 6. JDK 中常用的包有哪些? 7. 访问修饰符 public、protected、 default、private 的区别? 类的成员不写访问修饰符默认为 受保护(protected)对子类相当于公开,对于不是同一个包没有父子关系的类相当于私有。 Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。 8. 数据基础类型有哪些? 基础类型有 8 种:byte、boolean、char、short、int、float、long、double,注意 String 不属于基础类型, 属于对象。 9. final 有什么用? 用于修饰类、属性和方法; 10. 常用的集合类有哪些? 最常用的集合类是 List 和 Map。List 的具体实现包括 ArrayList 和 Vector,它们是 11. HashMap 和 Hashtable 有什么区别? HashMap 运行 key 和 value 为 12. HashMap 的实现原理是什么? HashMap 基于 13. ConcurrentHashMap 的实现原理是什么? ConcurrentHashMap 是 14. ArrayList 和 LinkedList 的区别是什么? 15. 如何实现 Array 和 List 之间的转换? 16. 在 Queue 中 poll() 和 remove() 有什么区别? 两者都是返回第一个元素,并在队列中删除返回的对象。不同的是如果没有元素 17. 哪些集合类是线程安全的? Vector、Hashtable 都是 18. 什么是 Java 反射? 在 Java 19. Java 怎么实现动态代理? Java 中,常用的动态代理实现方式有两种,一种是利用 20. 进程和线程有什么区别? 两者关系:一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程,资源分配给进程,同一进程的所有线程共享该进程的所有资源。 追问:GC(垃圾回收)知道吗? 垃圾回收线程是 21. 创建线程有哪几种方式? 创建线程有三种方式: 22. 什么是多线程,多线程的优劣? 多线程:多线程是指程序中包含 多线程的好处: 可以提高 多线程的劣势: 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 多线程需要协调和管理,所以需要 CPU 时间跟踪线程; 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。 创建线程池的方式有多种,这里你只需要答 ThreadPoolExecutor 即可。 ThreadPoolExecutor() 是最原始的线程池创建,也是阿里巴巴 Java 开发手册中明确规范的创建线程池的方式。 24. 线程池的常用参数有了解吗? ThreadPoolExecutor 包含以下七个参数: 前两个参数可以这么理解,如果运行的线程少于 corePoolSize,Executor 则可以不排队直接添加新的线程;如果大于等于 corePoolSize,则将请求加入队列,如果无法加入,则创建新线程;如果超出 maxinumPoolSize,任务被拒绝。 25. 怎么保证线程安全? 26. synchronized 和 Lock 有什么区别? 27. 什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。 追问:怎么避免? 28. ThreadLocal 是什么?有哪些使用场景? 当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 ThreadLocal 的经典使用场景是 session 管理(不同的线程对应不同的 session)和数据库链接(为每个线程创建不同的链接)。 29. 你了解哪些设计模式? 30. 简单工厂模式和抽象工厂模式有什么区别? 31. Spring 框架的优点有哪些? 32. 什么是 Spring AOP? 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。主要体现在事务处理、日志管理、权限控制、异常处理等方面。 33. 什么是 Spring IoC? 即 inverse of control(控制反转),是 Spring 的核心,是一种创建对象的思想。将创建对象的权力交给 Spring 容器,其实就是让 Spring 容器帮你创建对象,而你不需要在 Java 代码中 new 对象了。 34. Spring 常用的注入方式有哪些? 35. Spring 自动装配 bean 有哪些方式? Spring 配置文件中 节点的 autowire 参数可以控制 bean 自动装配的方式: 36. @Autowired 是做什么用? @Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 Spring 完成 bean 自动装配的工作。 37. Spring Boot 有什么优势? Spring Boot 继承了 Spring 优点,使得开发更加方便快捷。 38. Spring Boot 配置文件有哪几种类型? 配置文件有 39. Spring Cloud 是什么? Spring Cloud 是基于 Spring Boot 的一整套实现微服务的框架。它它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。 40. Spring Cloud 的核心组件有哪些? 当然,除了以上还有很多,就不一一列举了。 41. MyBatis 和 Hibernate 的区别有哪些? 42. ZooKeeper 是什么? ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。 43. ZooKeeper 集群选主和同步的机制是什么? ZooKeeper 的核心是原子广播,这个机制保证了各个 Server 之间的同步,实现这个机制的协议叫做 ZAB 协议。ZAB 协议有两种模式:分别是恢复模式和广播模式。 44. 集群中有 3 台服务器,宕机 1 台,这个时候 ZooKeeper 还可以使用吗? 可以,根据选票过半的选举原则,因此集群节点最好为奇数;单数服务器只要没超过一半的宕机就可以继续使用;所以 ZooKeeper 集群的容灾数量 =(集群总节点数 – 1)/2;也就是说 3 台服务器集群的话,最多允许 1 台宕机。 45. Redis 是什么?都有哪些使用场景? Redis 是一个使用 Redis 使用场景: 46. 你使用过 Redis 的哪些常用功能? 47. Redis 支持的数据类型有哪些? Redis 支持的数据类型:string、list、hash、set、zset(sorted set)。 48. Redis 和 Memcache 有什么区别? 49. 什么是缓存穿透?怎么解决? 50. 缓存和数据库之间怎么保证双写一致性? 51. Redis 持久化有几种方式? 52. Redis 怎么实现分布式锁? Redis 分布式锁一般使用 setnx(set if not exists)指令,只允许被一个程序占有,占用成功了就可以继续执行,失败了就只能放弃或稍后重试,使用完调用 del 释放锁。 伪代码示例(这里只是简述,实际应用没有那么简单的,感兴趣的同学可以详细查一下资料): 53. 消息队列的使用场景有哪些? 54. 消息队列包含哪些核心角色? 55. JMS 和消息队列的关系? JMS(Java Messaging Service)是 Java 平台上有关面向消息中间件的技术规范,通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为 Java 消息服务。它是 Java EE 中定义的一组标准 API,它自身并不是一个消息服务系统。 56. ActiveMQ 的基本使用? Linux 下安装 ActiveMQ:下载 activemq 压缩包(apache-activemq-5.13.0-bin.tar.gz)解压,执行 apache-activemq-5.13.0/bin/activemq,检测 activemq 是否安装成功: ActiveMQ 前端控制台端口默认 8161 端口,在 jetty.xml 中的 jettyPort 对应的 port 可以改成你想要设置的端口。部署完毕后可以打开 https://localhost:8161/admin/ 进入控制台页面,账号密码默认 admin。 在 conf/activemq.xml 中 61616 的默认端口来自 transportConnector 对应的 URI 地址,如果想要修改或新增端口,也可以在这个地方新增或修改。 ActiveMQ 启动命令为 activemq start,停止命令为 57. ActiveMQ 消息传输模式 点对点模式 在点对点模型中,一个消费者对应一个生产者,生产者将消息放入队列中,当消费者请求队列中的消息时,消息会从队列中取出,并投递给消费者,消息投递后会从队列中删除,这样就可以保证消息只能投递给一个接收者。而且消息发送客户端与接收客户端没有时间上的依赖,发送客户端可以在任何时刻发送信息到队列,而不需要知道接收客户端是不是在运行。 发布/订阅模式 一个生产者产生消息发送后,可以被多个消费者进行接收。消息会发送给一个主题,与队列类似,多个接收者都可以监听一个主题。但与队列不同的是,消息主题的所有订阅者都会接收到此消息。并且必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。 58. ActiveMQ 的消息持久化策略 消息持久性对于可靠消息传递来说是一种比较好的方法,即时发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重启后仍然可以将消息发送出去。消息持久性的原理很简单,就是在发送消息出去后,消息中心首先将消息存储在本地文件、内存或者远程数据库,然后把消息发送给接受者,发送成功后再把消息从存储中删除,失败则继续尝试。 ActiveMQ 的消息持久化的默认机制是 KahaDB,还有 JDBC 不过一般不用,KahaDB 可用于任何场景, 提高了性能和恢复能力。消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址。KahaDB 是一个专门针对消息持久化的解决方案, 它对典型的消息使用模式进行了优化。在 Kaha 中,数据被追加到 data logs 中。当不再需要 log 文件中的数据的时候, log 文件会被丢弃。 配置方式:在 conf/activemq.xml 文件中 59. 数据库的三范式是什么? 60. ACID 分别指的是什么? 61. SQL 的内连接、左连接、右连接有什么区别? 内连接是把匹配的关联字段显示出来;左连接会读取左边数据表的全部数据,即使右边数据表没有对应数据。右连接会读取右边数据表的全部数据,即使左边数据表没有对应数据。 62. MySQL 索引是怎么实现的? MySQL 官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是一种数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。目前主流的数据库引擎的索引都是 B+ 树实现的,索引的性能也是更好的。 63. 怎么验证 MySQL 的索引是否满足需求? 需要根据查询需求来判断配置哪种索引,确定索引后,可以通过 explain 命令来查看执行计划,确认是否满足需求。explain 语法: 64. 说一下数据库的乐观锁和悲观锁? 65. MySQL 问题排查都有哪些手段? 66. 如何做 MySQL 的性能优化? 67. 你了解类加载过程吗? 68. 什么是双亲委派模型? 当收到加载一个类的请求时,子类加载器并不会马上去加载,而是依次去请求父类加载器加载,一直往上请求到最高类加载器:启动类加载器。当启动类加载器加载不了的时候,依次往下让子类加载器进行加载。当达到最底下的时候,如果还是加载不到该类,就会出现 ClassNotFound 的异常。 69. 你熟悉 JVM 哪些垃圾回收算法? 70. 你熟悉 JVM 哪些垃圾回收器? 这里简述几个经典常用的即可: 71. 你熟悉 JVM 哪些调优参数? 1. 明确技术方向,匹配岗位要求 学历、工作年限、技能、项目经历、软实力。找准定位,是要做技术还是偏管理。划重点:做技术就不要提管理。面试官非常讨厌技术不扎实的人,明明是面试技术,却总是提管理。这里不是说不需要管理能力,而是要分清楚主次,只有你的技术使面试官满意了,管理能力才能为你加分。 2. 盘点个人价值,找亮点 《天道》中的一句话,博主给大家,不要太把自己当人,因为在 HR 们的眼中,我们都是商品,你要把自己的价值以最直观的方式体现出来,不要扯其他没用的。明确了自己有什么价值,你需要问自己一个问题:以行业标准衡量,你觉得你是哪个领域的专家?因为你只有是某个领域或者方向的专家,性价比高,HR 们才会觉得这笔买卖很划算。不要自惭形秽,你之所以平庸,是因为你没有深挖自己的亮点,在简历最后一栏自我评价里,把亮点一一列举出来,如果你实在是找不到,那总做过项目吧,能吃苦吧,善与人相处吧,逐条写出来。 划重点:项目经验多不代表能力强,要总结而不是叙述,千万不要逐个项目长篇叙述业务模块,面试官对你做过的项目业务逻辑根本不感兴趣,你需要把项目中你用过的技术列举出来,最好是只写最近的或者你最有成就感的项目,把你了解的技术栈全都写上。 3. 内推和猎头,机会大很多 选择公司也很重要,是互联网公司还是传统企业,传统企业相对重视业务,而互联网公司比较重视技术。公司主要是做什么产品、用的什么技术 。如果你的资历不够,学历双非,但技术很强,想去大厂也不是没机会。划重点:找内推、找猎头推荐要比自己投简历要机会大得多。 4. 知己知彼百战不殆 薪资、福利、平台优势、晋升机制、工作环境、人际关系、工作强度、社会地位等等,把这些全都列出来,做个表格,排好优先级。现在业界对于跳槽涨薪的幅度大都控制在 30% 以内,了解一下你的城市、这个企业这个技术方向的平均薪酬来参考。划重点:知己知彼才好跟 HR 谈薪。 5. 一份简历闯天下?不可取 不同的企业、岗位需要的技能不同,你需要制定有针对性的简历。 划重点: 6. 练习自我介绍 直接划重点: 最后,拿得出手的经典项目准备一个,刷刷面试题,还要准备一些非技术类问题,比如这个必问的经典问题:你为什么离职?关于这个问题,说心里话,没必要那么固执。不要回答“上个公司加班太多,工作生活不能兼顾诸如此类 “,这样回答虽然没毛病,但是却不是标准答案,试问哪个互联网公司不加班?如果有,谁不想去?这个问题标准答案是:我的个人职业规划的原因,我需要一个更大的平台来施展,不断地见识、学习和成长。 最后还要准备一两个问面试官的问题,标准答案:贵公司当前使用的主流技术栈有哪些?如果我顺利通过面试,我将会加入哪个团队?我未来的工作方向是什么?千万别扯别的,诸如你们公司薪酬大概是多少?(保密的不知道吗),你们加班多不多?(废话)。管住好奇心,这些问题等你过了技术面试,留着 HR 来回答你。 大家看看,面试前都要准备那么多,如果是资深工程师岗位或者技术专家岗位,你可能起码要准备 3 个月,即便是初/中级工程师,面试前也要认真准备 1 个月,这样你的面试成功率才会高很多。 写了很多,大家发现我很爱说“划重点”、“标准答案”、“千万别扯” 之类,因为真的就是这样。仿佛回到高三时,语文老师教我答题,他的口头禅是:不要乱写、不要你以为、按标准答案去“套”。非常感谢我当时的语文老师(语文没有拖我的后腿,偷笑),以理科状元的优异成绩考入华科。所以,我认为求职并不是一场对等的谈判,而是一场考试(当然如果你是 BAT 系的大神,另当别论,这里不纠结哈),高考有考霸,那么面试呢自然也会有面霸,都有套路,这取决于你对套路的掌握程度。 其实还有很多话,担心思路一旦打开,喷涌而出,刹不住车了(大多也是在倒苦水,面试官也很无奈,哈哈,把面试者在面试过程中的不按套路出牌的地方梳理总结一下,给后来的人以指引,不至于掉坑)。
序言
文章分为八个部分,从 Java 基础、Java 核心、Java 进阶、Java 框架、分布式中间件、MySQL、JVM 到如何准备技术面试。先帮读者梳理知识点,这是我们的硬实力,打铁还需自身硬;然后我们还要有准备的去打好面试这场仗,无论是技术一面、二面 还是 HR 面试,都要认真准备,把自己的软实力也充分发挥出来,毕竟不是每个面试官都能一眼看透你的价值,你需要把发光点主动地表现出来。一、Java 基础知识
不能缩小父类方法的访问权限
,且只能比父类抛出更少的异常
;被覆盖的方法不能为 private
,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。同一个类中
可以有多个名称相同的方法,但这些方法的参数类型、个数、顺序至少有一个不相同。final
的时候不能被重写。
abstract
修饰;new
关键字来实例化对象;可以不包含抽象方法
,抽象类中可以有具体的方法;
interface
修饰;均为抽象方法
;
JRE
: Java 运行环境,为 Java 的运行提供了所需环境。JDK
: Java 开发工具包,提供了 Java 的开发环境和运行环境,JDK 包含 – JRE 还有 Java 编译器、Java 调试和分析工具等。JVM
是 Java 虚拟机,负责将 Java 字节码转换为机器码,正是 Java 能够跨平台的原因。它还提供了内存管理
、垃圾回收
和安全机制
等。
按值的拷贝传递
,传递的是值的拷贝,也就是说传递后就互不相关了。
lang
:这个是系统的基础类;io
:这里面是所有输入输出有关的类,比如文件操作等;nio
:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;net
:这里面是与网络有关的类;util
:这个是系统辅助类,特别是集合类;sql
:这个是数据库操作的类。
default
,默认对于同一个包的其他类相当于公开(public),对于不是同一个包的其他类相当于私有(private)。凡是引用 final 关键字的地方皆不可修改!
二、Java 核心知识
可变大小
的列表,比较适合构建、存储和操作任何类型对象
的元素列表。 List 适用于按数值索引
访问元素的情形。Map 提供了一个更通用
的元素存储方法。Map 集合类用于存储元素对(称作” 键” 和” 值”),其中每个键映射到一个值。
null
,而 Hashtable 不允许。Hashtable 是线程安全
的,而 HashMap 是非线程安全
的。Hash 算法
实现的,我们通过 put(key,value) 存储,get(key) 来获取。当传入 key 时,HashMap 会根据 key. hashCode()
计算出 hash 值
,存储时,如果出现 hash 值相同的 key,此时有两种情况,如果 key 相同,则覆盖原始值;如果 key 不同,即出现冲突,则将当前的 key-value 放入链表中。获取时,直接找到 hash 值对应的下标,在进一步判断 key 是否相同,从而找到对应值。Java1.5
中引用的一个线程安全
的支持高并发
的 HashMap 集合类。该类包含两个静态内部类 HashEntry
和 Segment
,前者用来封装映射表的键值对
,后者用来充当锁的角色
。Segment 采用了非常精妙的“分段锁”策略
,每个 Segment 对应一个 HashEntry 数组,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment 锁。
数组
,LinkedList 的实现是基于双向链表
;
Arrays. asList(array)
;toArray()
方法。poll()
会返回 null
,而 remove() 会直接抛出异常
。线程安全
的,而 HashMap 是非线程安全
的,不过 Java. util. concurrent 并发包中,ConcurrentHashMap 是线程安全
的。运行时
环境中,对于任意一个类
,能够知道
这个类有哪些属性和方法
,对于任意一个对象
,能够调用
它的任意一个方法
。JDK 反射机制生成代理
,另外一种是使用 CGLIB 代理
。JDK 代理必须要提供接口
,而 CGLIB 则不需要,可以直接代理类
,是基于继承当前类的子类实现的。三、Java 必问专题
重点在系统调度和单独的单位
,也就是说进程是可以独 立运行的一段程序
。CPU 调度和分派的基本单位
,他是比进程更小的能独立运行的基本单位。特殊的守护线程
,守护线程是运行在后台
的一种特殊进程。它独立
于控制终端并且周期性
地执行某种任务或等待处理某些发生的事件。
Thread
类重写 run
方法;Runnable
接口;Callable
接口。多个执行流
,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。CPU 的利用率
。在多线程程序中,一个线程必须等待的时候,CPU 可以运行其它的线程而不是等待,这样就大大提高了程序的效率。也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
四、Java 框架
. properties
格式和 . yml
格式,它们主要的区别是书法风格不同。
五、分布式系统基础中间件
C 语言
开发的高效缓存内存数据库
。
netstat -an | grep 61616
。activemq stop
,查看运行状态命令为 activemq status
。六、MySQL
列的原子性
,即列不能够再分成其他几列;
explain select * from table
。
netstat -ntp |grep 46888
),通过线程号排查是哪个应用(ps -ef | grep pid
);
select *
,列出查询字段;七、JVM
加载
:通过一个类的全限定名来获取其定义的二进制字节流,将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构,在堆中生成一个代表这个类的 Class 对象,作为方法区中这些数据的访问入口;验证
:主要作用就是确保被加载的类的正确性,主要包含文件格式的验证,元数据验证,字节码验证和符号引用验证;准备
:主要为类变量分配内存并设置初始值;解析
:主要是虚拟机将常量池中的符号引用转化为直接引用的过程。符号引用指的是一个标示,而直接引用是指向内存中的地址;初始化
:主要为类的静态变量赋予正确的初始值,JVM 负责对类进行初始化,主要对类变量进行初始化。
标记—清除算法
:标记无用对象,然后进行清除回收。缺点:会带来另一个新的问题:内存碎片化。复制算法
:首先还是先标记处待回收内存和不用回收的内存,然后将不用回收的内存复制到新的内存区域,这样旧的内存区域就可以全部回收,而新的内存区域则是连续的,解决了内存碎片化的问题,但是缺点是会损失掉部分系统内存,一般是新生代使用。标记—整理算法
:首先还是“标记”,标记过后,将不用回收的内存对象压缩到内存一端,此时即可直接清除边界处的内存,一般是老年代使用。
Serial
:单线程串行垃圾回收器。ParNew
:多线程的串行垃圾回收器。Parallel
和 ParNew
类似是多线程的,但 Parallel 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。CMS
:一种以获得最短回收停顿时间为目标的收集器,采用标记—清除算法。
-Xms2g
堆初始值 2G-Xmx2g
堆最大可用内存 2G-XX:NewRatio=4
新生代: 老年代内存比例 = 1:4-XX:PrintGC
触发 GC 时打印日志-XX:PrintGCDetails
触发 GC 时打印详细日志-XX:UseSerialGC
使用 Serial 串行回收器XX+UseParNewGC
使用 ParNew + Serial Old 垃圾回收器组合八、如何准备技术面试
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算