SegmentFault 猪哥Java最新的文章
2021-02-25T11:33:40+08:00
https://segmentfault.com/feeds/blogs
https://creativecommons.org/licenses/by-nc-nd/4.0/
Java异常简单介绍
https://segmentfault.com/a/1190000039279821
2021-02-25T11:33:40+08:00
2021-02-25T11:33:40+08:00
猪哥66
https://segmentfault.com/u/pig66
2
<blockquote>本文收录在猪哥GitHub:<a href="https://link.segmentfault.com/?enc=LNVkz7OtAdX2E1xMrmeZyQ%3D%3D.6hFcdgyhv7XpYTGC6PYP0fn01wF%2F3W2bxkJ%2FStlZQ9M%3D" rel="nofollow">https://github.com/pig6/Java</a> 中,本项目收集一线大厂面试、实战、Java学习路线等。</blockquote><h2>一、异常产生的原理</h2><p>JVM针对程序运行监测出的异常创建个异常对象,对象包含了异常产生的:内容、原因、位置。根据程序逻辑将异常对象层层抛出或者处理。</p><h2>二、Throwable体系</h2><h3>1.Error</h3><p>错误Error一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。</p><ol><li><p>VirtualMachineError</p><ul><li>OutOfMemoryError</li><li>StackOverflowError</li></ul></li><li><p>LinkageError</p><ul><li>NoClassDefFoundError</li><li>NoSuchMethodError</li></ul></li><li>。。。</li></ol><h3>2.Exception</h3><p><strong>1> 运行时异常 RuntimeException</strong>:是指“可以避免的异常”,如 null引用异常,这类异常都是由程序内部原因造成的,是可以避免的,考验开发的严谨性,因此这个问题是我们作为一名开发必须要避免发生的,再大的公司每年总会有几次事故是因为NPE导致的,我们如果因为这种问题被通报了就是很尴尬的事情了(对生产环境一定要有足够的敬畏心啊)。</p><p>常见的运行时异常有以下几种:</p><ul><li>NullPointerException</li><li>ClassCastExecption</li><li>ArithmeticException</li><li>IndexOutOfBoundsException</li><li>ClassNotFoundException</li></ul><p><strong>2> 非运行时异常</strong>:代表“无法避免的异常” 如io异常,往往这类异常是由于外部原因造成的,程序本身无法保证他们不发生,所以这类异常必须捕获,这就是我们在使用io资源或者操作线程比如sleep的时候必须要捕获或者抛出的原因。</p><p>常见的有:</p><ul><li>IOException</li><li>InterruptedException</li><li>SQLException</li><li>自定义的非RuntimeException</li></ul><p><img src="/img/remote/1460000039279824" alt="在这里插入图片描述" title="在这里插入图片描述"></p><h3>3.Check And UnCheck</h3><p><strong>1>CheckedException</strong>:等价于非运行时异常,要么捕获,要么抛出,否则编译无法通过。代表“无法避免的异常” 如io异常 往往这类异常是由于外部原因造成的,程序本身无法保证他们不发生<br><strong>2>UnCheckedException</strong>:包括:Error&运行时异常</p><h2>三、方法</h2><ul><li>toString:异常类信息+异常信息描述</li><li>getMessage:异常信息描述</li><li>printStackTrace:最常用打印完整的错误堆栈信息</li></ul><h2>四、catch还是throw</h2><p>通常应该捕获那些知道如何处理的异常,而将那些不知道如何处理的异常进行传递。如果想传递一个异常,就必须在方法的声明中添加一个throws说明符,以便告知调用者这个方法可能会抛出异常。</p><h2>五、finally</h2><ol><li>无论是否出现异常都会执行</li><li>必须与try一起使用</li><li>注意:finally中有return语句永远返回finally中的return,try块中的return不会生效</li></ol><p><img src="/img/remote/1460000039279823" alt="在这里插入图片描述" title="在这里插入图片描述"></p><h2>六、其他</h2><ol><li>如果父类抛出了多个异常,子类重写父类方法的时候,抛出和父类相同的异常//是父类异常的子类//或者不抛出</li><li>父类方法没有抛出异常,子类重写父类该方法的时候也不可以抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出</li><li><p>使用习惯:</p><ul><li>不要丢弃异常,捕获异常后需要进行相关处理。如果用户觉得不能很好地处理该异常,就让它继续传播,传到别的地方去处理,或者把一个低级的异常转换成应用级的异常,重新抛出</li><li>catch语句应该指定具体的异常类型。不能把不该捕获的异常也捕获了</li><li>在finally里面释放资源。如果finally里面也会抛出异常,也一样需要使用try..catch处理</li><li>不要把大量的代码塞在try...catch块里面,分离各个可能出现异常的语句并分别捕获异常</li></ul></li></ol><p><strong>遗留问题:</strong> 编码中是该捕获Exception还是Throwable呢?欢迎评论区交流!!</p>
互联网大厂必学技能:压力测试!
https://segmentfault.com/a/1190000039261485
2021-02-23T14:51:55+08:00
2021-02-23T14:51:55+08:00
猪哥66
https://segmentfault.com/u/pig66
7
<blockquote>本文收录在猪哥GitHub:<a href="https://link.segmentfault.com/?enc=QJ19f%2FiEOudpYYn%2B21TKKg%3D%3D.ISCh13lws5KRFG6KMPiEtMVH6PJ6zY629J5zWdFUJ0k%3D" rel="nofollow">https://github.com/pig6/Java</a> 中,本项目收集一线大厂面试、实战、Java学习路线等。</blockquote><p>压测全称为压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患。</p><p>在开发接口或者功能点完成后,就需要对接口或功能点压力测试,测试出接口的极限以应对较大并发,举一个最直接的例子:淘宝双十一购物节,2018年淘宝交易创建峰值达到49.1万笔/秒,而在双十一之前淘宝都要对系统进行压测,看是否能够抗住每年创新高的并发!</p><p>大白话:不停地请求服务的接口,设置每秒的请求量以及持续时间,看看什么时候服务开始处理失败,从而得出服务的性能指标。</p><h2>一、笔记目的</h2><ul><li>简单认识压测(的目的)</li><li>介绍压测平台应该有哪些能力</li></ul><h2>二、压测目的</h2><ul><li><p>挖掘系统瓶颈点</p><ul><li>cpu计算能力</li><li>业务代码(频繁full gc等)</li><li>DB</li><li>线程模型</li><li>带宽等</li></ul></li><li><p>建立性能基线</p><ul><li>qps (request per second)</li><li>rt (response time)</li><li>用于线上扩容策略配置等</li></ul></li><li><p>优化系统性能</p><ul><li>配置DB主从</li><li>jvm参数优化</li><li>缓存改造</li><li>线程模型改造等</li></ul></li></ul><h2>三、压测平台应该具备的能力</h2><h3>1.压测场景</h3><ul><li><p>rpc场景(一般为压测单个服务的性能)</p><ul><li>回放录制的流量</li><li>自定义的流量</li></ul></li><li><p>http场景(一般为全链路压测)</p><ul><li>回放录制的流量</li><li>自定义的流量</li></ul></li></ul><h3>2.数据</h3><p>准备数据用于压测的时候使用</p><ul><li><p>录制任务</p><ul><li>http请求的录制</li><li>rpc请求的录制</li></ul></li></ul><h3>3.压测参数配置</h3><ul><li><p>压测类型</p><ul><li>普通压测(普通循环播放流量)</li><li>调试(单次流量播放,一般用于调试链路是否接通)</li><li>递增(设置压测的多个阶段,每个阶段配置不同的qps以及持续时长)</li></ul></li><li><p>配置</p><ul><li><p>变量配置(单是流量录制是不够的,特殊的接口(比如关注行为)需要变化请求的参数,因此需要支持变量配置)</p><ul><li><p>自增变量</p><ul><li>设置起止值</li><li>设置步长</li></ul></li><li><p>文件变量</p><ul><li>读取变量列</li></ul></li><li><p>时间变量</p><ul><li>对当前毫秒戳做加减操作</li></ul></li><li><p>计算变量</p><ul><li>uuid</li><li>区间random</li></ul></li><li>预定义变量(就是写死一个值)</li></ul></li><li><p>请求配置</p><ul><li>指定接口与方法/url</li><li>指定机器</li><li>超时时间</li><li><p>变量</p><ul><li>指定配置好的变量</li></ul></li></ul></li><li><p>压测配置</p><ul><li>初始qps</li><li>期望最大qps</li></ul></li><li><p>词表配置</p><ul><li>循环回放流量录制中的流量</li></ul></li><li><p>资源隔离</p><ul><li>DB隔离</li><li>缓存隔离</li><li>MQ隔离</li></ul></li><li>静默期(那个时间段不可以进行压测)</li></ul></li></ul><h3>4.保护策略</h3><p>配置不同的监控项以及异常的处理策略:比如停止压测或者降低压测流量等</p><ul><li><p>db保护策略</p><ul><li><p>配置db的告警阈值</p><ul><li>告警之后自动降低指定的qps或者停止压测</li></ul></li></ul></li><li><p>机器保护策略</p><ul><li>监控cpu gc 内存等等等等</li><li>降低qps或者停止</li></ul></li><li><p>服务保护策略</p><ul><li>监测请求的响应情况</li><li>降低qps或者停止</li></ul></li></ul><h3>5.监控</h3><p>配置不同的监控项用于判断性能瓶颈</p><ul><li><p>客户端响应情况监控</p><ul><li>qps</li><li>rt</li><li>错误率</li></ul></li><li><p>服务端监控####</p><ul><li>业务日志</li><li><p>机器</p><ul><li>cpu</li><li>线程池</li><li>服务接口等待队列大小等</li></ul></li></ul></li></ul><h2>四、压测报告</h2><ul><li><p>需要输出压测报告用于分析和记录</p><ul><li>各个监控项的指标</li><li>压测结果的指标</li><li>等等</li></ul></li></ul><p>今天为大家简单列举了一些压测的知识点,以后有时间再为大家详细介绍哦,欢迎一键三连!!!</p>
【重点】Java大厂面试10个知识点汇总
https://segmentfault.com/a/1190000039153631
2021-02-02T16:04:48+08:00
2021-02-02T16:04:48+08:00
猪哥66
https://segmentfault.com/u/pig66
14
<blockquote>本文收录在猪哥GitHub:<a href="https://link.segmentfault.com/?enc=4pMazfBE6pU7oStBmicMfg%3D%3D.UECjt2GgNmjc8JYezuYjF93soG7E8%2FJll%2Bb%2Fbr0wKSY%3D" rel="nofollow">https://github.com/pig6/Java</a> 中,本项目收集一线大厂面试、实战、Java学习路线等。</blockquote><p>本篇笔记是我五年来的工作学习面试经验&记录,希望对大家有一些帮助</p><h2>一、java基础</h2><ul><li>Object类的所有方法:getClass hashCode equals clone toString notify notifyAll wait finalize</li><li>八种基本数据类型&取值范围</li><li>自动拆装箱&包装类型的缓存机制</li><li>ThreadLocal 理解String&不可变性 StringBuffer StringBuilder源码</li><li>ArrayList LinkedList HashMap(重点,可以花一天时间彻底掌握) LinkedHashMap TreeMap HashSet LinkedHashSet TreeSet源码</li><li>异常体系结构</li><li>Java8:理解函数式编程 流式操作 CompletableFuture</li></ul><h2>二、并发编程</h2><p>必考,高并发的解决必要手段,对于juc以及线程模型的演进过程的掌握非常重要</p><ul><li>理解并发与并行</li><li>线程池的原理:理解每个参数</li><li>Thread Runnable Callable</li><li>AQS(重要:常常会配合synchronized来说) Condition</li><li>Lock:ReentrantLock ReentrantReadWriteLock</li><li>Semaphore CountDownLatch CyclicBarrier</li><li>各种Atomic</li><li>ConcurrentHashMap BlockingQueue CopyOnWriteArrayList</li><li>Executors</li><li>线程的状态转换:wait sleep notify notifyAll join park</li><li>停止线程的方法</li><li>线程模型:理解BIO、NIO(重点)、AIO、了解netty</li><li>并发包就那些东西,掌握AQS之后其他的很快就打通了,所以不用</li></ul><h2>三、jvm</h2><p>《深入理解java虚拟机》没事就看一遍,每次都会有新的理解</p><ul><li>jvm内存结构</li><li>常用调优参数</li><li>gc算法</li><li>gc的工具:CMS&G1重点&ZGC</li><li><p>java内存模型:</p><ul><li>可见性、原子性、顺序性、happens-before、内存屏障、volatile、final</li><li>synchronized(对象头):偏向锁->轻量级锁->重量级锁、monitor、锁优化、锁消除、锁粗化、自旋锁、可重入锁</li></ul></li><li>常用工具以及命令</li><li>类加载过程</li><li>对象创建过程</li><li>fullGC的排查思路</li><li>工具:jps, jstack, jmap、jstat, jconsole, jinfo, jhat, javap, Arthas</li></ul><h2>四、设计模式</h2><ul><li>创建型:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。</li><li>结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。</li><li>行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。</li></ul><h2>五、mysql</h2><p>下面列出来的全是重点</p><ul><li>常用sql以及内置函数</li><li><p>索引</p><ul><li>hash索引</li><li>b+树的索引</li><li>聚集索引&非聚集索引</li><li>回表</li><li>联合索引:最左前缀&覆盖索引&索引下沉</li></ul></li><li>事务&隔离级别&实现原理:readview undolog redolog mvcc</li><li>锁的使用&锁算法&行锁&表锁&乐观锁&悲观锁</li><li>连接查询的原理(算法)</li><li>binlog&使用场景</li><li>分库分表:垂直&水平</li><li>工具:explain</li></ul><h2>六、redis</h2><p>《redis的设计与实现》看完这本书就行了,深入浅出,很快就可以看完和掌握,直接搞定redis</p><ul><li>熟练五种类型对象&适用场景:字符串 列表 哈希 集合 有序集合</li><li>了解底层数据结构:SDS 链表 字典 跳跃表 整数集合 压缩列表</li><li>淘汰策略</li><li>RDB&AOF</li><li>复制功能的实现</li><li>Sentinel&集群的结构</li><li>发布订阅&事务</li><li>分布式锁</li><li>常见问题&解决方案:缓存击穿,缓存穿透,缓存雪崩</li></ul><h2>七、web</h2><p>感觉很少有人问了,应届生可能问的多些</p><ul><li>三次握手与四次挥手</li><li>http/1.0 http/1.1 http/2之间的区别</li><li>http中 get和post区别</li><li>理解https加密过程</li><li>forward&redirect的区别</li><li>CSRF&XSS攻击与防范</li><li>常见的web请求返回的状态码</li><li>cookie&session</li><li>Servlet&filter&listener</li><li>DNS</li><li>tomcat&nginx区别</li></ul><h2>八、spring</h2><p>说实话问到我的不多,感觉掌握下面几个足够了</p><ul><li>IOC&DI&AOP</li><li>掌握常用注解</li><li>如何解决循环依赖</li><li>事务传播机制</li><li>事务失效场景</li><li>springMVC的理解</li><li>springboot的理解</li></ul><h2>九、分布式&高可用</h2><p>平时多注意怎么处理好程序可能遇到的极端情况,保证服务的高可用</p><ul><li><p>zookeeper</p><ul><li>理解使用:文件系统+监听器</li><li>了解选举算法&分布式锁的实现</li></ul></li><li><p>mq(重要,有时候面试官直接一串mq连环炮就可以决定要不要一个人了)</p><ul><li>作用:异步 解耦 削峰</li><li><p>kafka(之后会就kafka写一个系列)</p><ul><li>设计架构</li><li>如何保证高可用</li><li>如何保证高吞吐</li><li>如何实现局部有序</li><li>重复消费的问题</li><li>延迟消息</li></ul></li></ul></li><li>了解dubbo&spring cloud&Consul工作流程</li><li>限流&熔断:Hystrix/Resilience4j(高可用的必须中间件)</li><li>链路追踪(了解实现原理)</li></ul><h2>十、算法&数据结构</h2><p>常刷leetcode</p><ul><li>栈、队列、链表、数组、哈希表、树、堆、图</li><li>快排&二分&分治&递归&滑动窗口/双指针&BFS&DFS</li></ul><h2>十一、工具</h2><ul><li>git多分支协作流程</li><li>maven常用命令&生命周期</li><li>linux常用命令:tail grep awk sed等等</li></ul><h2>备注</h2><ul><li>看着确实很绝望,up本人也是</li><li>个人难免有盲区,欢迎评论区指正&补充,会持续更新</li><li>but</li><li>种一棵树,最好的时间是十年前,其次是现在,大家共勉</li></ul><pre><code>码字不易,欢迎一键三连 关注猪哥!</code></pre>