自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 优雅的单列模式

单列模式是java最常用的设计模式之一,可以降低资源开销,属于创建型设计模式,是一种最佳的创建对象的方式单列模式的特点1、单列类只能有一个实例2、单列类必须自己创建自己的唯一实例3、单列模式必须对外提供一个方法获取自己的实例单列模式的有点1、在内存中占有一个实例,减少内存的开销,尤其是频繁创建和销毁的实例2、避免对资源的多重占用(比如写文件的操作)单列模式的应用场景1、网站计数器2、应用程序的日志应用3、数据库连接池4、多线程的线程池设计饿汉式 //创建 SingleMode

2021-02-04 13:45:48 173

原创 volatile与synchronized原理

JMM即java内存模型,如果说是JVM调优,java内存结构 如堆和栈或者jvm的垃圾回收机制那可能是是偏题了,JMM内存模型研究的是多线程线Java代码的执行顺序和共享变量的读写需要搞清楚如下1、多线程下 读写共享变量会有哪些问题 (原子性问题-线程切换导致的指令交错,可见性有序性问题-jit编译优化,cpu缓存优化)2、解决这些问题的钥匙就是java内存模型,解决这些问题的手段–>掌握同步方法,如synchronized,ReentrantLock(解决原子性、可见性、有序性问题),vol

2021-01-25 00:34:38 330 1

原创 工厂模式的理解及实际运用

工厂设计模式:工厂模式是java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,可以提供一种创建对象的最佳方式,工厂只负责实现创建所有实例的内部逻辑,并且创建对象的方法可以被外部直接调用创建所需要的的对象实例;1、有点在于 一个调用者想创建一个对象,只要知道其名称就可以了,比如有些对象创建过程比较复杂代码量比较大那么使用工厂就可以减少代码量;2、屏蔽产品的具体实现调用者只需要关注产品接口就可以;3、降低了代码的耦合度,比如又甲乙丙都使用到了B 对象,常规操作需要在甲乙丙都创建B对象,使用了工厂的话

2020-11-09 23:37:39 1579 1

原创 代理模式的实现以及运用

代理模式实际上就是对于不能直接访问的对象提供给一个代理对象,通过代理对象可以访问该对象的功能,这样做的有点就每个对象的职责清晰,具有高扩展性更智能化,但是由于访问的对象当中增加了代理对象,有些类型的代理模式会造成请求的处理变慢,实现代理模式需要额外的工作会导致更加复杂;代理实现的技术方案:1、基于接口的动态代理(JDK动态代理,JDK官方的Proxy类),要求被代理的类最少实在这里插入代码片现一个接口;2、基于子类的动态代理(第三方的CGLib)要求被代理的类不能用final修饰的类(最终类,为什么不能用f

2020-11-07 00:10:56 517

原创 Spring中的观察者模式运用

观察者模式:对象之间一对一或者一对多依赖,当一个对象改变状态的时候,依赖他的对象会受到通知并且自动各更新,MQ其实就是属于观察者模式,发布者发布消息,订阅者获取消息,订阅就可以获取消息没订阅就获取不到信息;观察者模式的优点:观察者和被观察者是抽象耦合的,建立了一套触发机制观察者模式的缺点:如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。(比如A 和B 之前相互观察

2020-11-06 21:43:34 322

原创 StringBuilder与“+”加号拼接字符串区别

字符串拼接在开发过程中是非常平凡的常用的有三种方式1、加号拼接(str+“123”)2、StringBuilder拼接3、StringBuffer拼接StringBuffer是保证线程安全的,效率是比较低的,更多的应用场景是不会涉及到线程安全,所以会选择StringBuilder效率会高一些,那么问题来了StringBuilder和“+”谁的效率更高呢?public class Test { public static void main(String[] args) { new Test

2020-06-23 23:28:32 2341

原创 Mybatis执行sql时无报错并

在开mybatis的开发,从服务器中看到的日志是 要执行的sql语句被打印出来,但是没有打印参数信息,后台没有任何的报错 ,最后发现是某个参数值为null,mybatis在设置参数的时候出错了,报错的异常被其他异常给吃掉,解决办法就是 在xml文件中给sql设置参数的时候加上jdbcType=xxx;...

2020-06-20 16:47:28 1118 1

原创 JVM优化之Tomcat8优化

待续

2020-06-14 18:23:11 503

原创 JVM优化之jvm分配内存如何保证线程安全

1,堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的 2,JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer), 其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配, 在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空

2020-06-11 21:52:22 1748

原创 Tomcat优化之tomcat的三种运行模式

tomcat的运行模式有3种:bio 默认的模式,性能非常低下,没有经过任何优化处理和支持nio nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。apr 安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能在正常的使

2020-06-11 00:22:31 420

原创 Tomcat优化之执行器

在tomcat中用户每一个请求都是一个线程,所以可以使用线程池来提高tomcat性能修改conf目录下 server.xml文件#将注释打开,开启执行器<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/>参数说明:maxThreads:

2020-06-11 00:15:27 240

原创 Tomcat优化禁用AJP协议

登录tomcat 在服务状态页面中可以看到,默认状态下会启用AJP服务,并且占用8009端口。什么是AJP呢?AJP(Apache JServer Protocol) AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接有两种方式请求web服务第一种:请求tomcat服务器8080 端口 直接请求第二种:生产环境常用,在web用

2020-06-09 23:49:18 10621

原创 JVM优化之G1垃圾收集器如何做到可预测停顿的

G1垃圾收集器相关内容可以参考[G1垃圾收集器基础]一般的垃圾收集器一般的垃圾回收器把内存分成三类: Eden(E), Suvivor(S)和Old(O), 其中Eden和Survivor都属于年轻代,Old属于老年代,新对象始终分配在Eden里面,经过第一次垃圾回收的对象就被移动到Survisor区了也有可能是old区。这样的好处是1、把垃圾回收这个复杂的问题分成两个小的问题,针对于年轻代的对象,因为对象来的快去的也快所以垃圾比较多垃圾回收会比较频繁,但是年轻代在垃圾回收的时候需要暂停应用(因为需要清

2020-06-08 23:14:44 1116

原创 JVM优化之G1垃圾收集器

简单介绍G1G1垃圾收集器在jdk1.7中开始使用,oracle官方是计划在1.9中变成默认的垃圾收集器替代GMS垃圾收集器,可以看出来垃圾收集器的未来使用的是G1G1的设计原则:简化JVM的性能调优,以前在做调优的时候针对老年代、年轻代等进行调优,G1就变得简单,只需要三个步骤即可以调优,1、开启G1垃圾收集器;2、设置最大的堆内存;3、设置最大的停顿时间。在G1中提供了三种垃圾收回收模式,包括Young GC(年轻代gc)、Mixed GC(混合gc)、Full GC(堆内存的全量gc)G1原理

2020-06-07 23:09:47 1332

原创 JVM优化之串行垃圾收集器与并行垃圾收集器

在JVM中实现了多种垃圾收集器如串行垃圾收集器,并行垃圾收集器,GMS(并发)垃圾收集器,G1垃圾收集器串行垃圾收集器串行垃圾收集器是在使用单线程进行垃圾回收,垃圾回收时只有一个线程在工作,并且java中所有的线程都要停止工作等待垃圾回收完成,对于交互比较强的的应用串行垃圾收集器不适用,一般javaWebyingy 不会使用这种垃圾收集器...

2020-06-05 00:29:02 619

原创 JVM垃圾回收算法理解3之复制算法与分代算法

将内存分为两个区域,内存1和内存2,使用的时候使用内存1,内存2 是空的,当内存1进行垃圾回收的时候,将存活对象复制到内存2,将内存1中的所有的对象回收,然后在将内存2与内存1 进行角色互换,这个时候内存1中的就没有内存碎片的问题所以进行垃圾回收的时候,可以看内存中的垃圾对象多还是存活对象多,当垃圾对象多的时候使用复制算法比较划算...

2020-06-04 01:13:47 344

原创 JVM垃圾回收算法理解2之标记清除算法和标记压缩算法

待续

2020-06-03 00:27:49 871

原创 JVM优化之常用参数

jvm优化为什么要做jvm的优化,在正常的本地开发中很少能用到,但是一旦程序部署到生产环境中就很可能出现应用运行到一半卡住了没有日志输出,程序没有反应,或者说对服务器做请求但是服务器没有任何的响应,或者服务器的cpu突然升高,或者出现内存溢出的情况,多数情况重启可以解决但是并不能依赖重启来解决问题,这个 时候就需要让程序不仅仅能够跑起来更需要跑的更快。jvm三种参数类型jvm 有三种参数类型,分别是 -help 、-version 标准参数,在各个jdk版本都有保留属于稳定参数;-X参数(-Xint、

2020-06-01 00:12:56 233

原创 JVM垃圾回收算法理解1之引用计数法快速理解

JVM垃圾回收之引用计数法引用计数法是历史最悠久的一种算法,引用:假设一个对象A 中定义了一个B 对象中的属性这个称为A 引用B ;原理: 对象B 引用对象A 那么对象A 的计数器就+1,同理被其他对象引用,计数器就+1 ,当对象B 引用失败了,那么对象A 的计数器就-1,当计数器值为0 时,gc就会将A 回收;优点:实时性很高,不用等到内存不够用的时候才去垃圾回收,运行时根据对象的计数器是否为0来判断,当计数器为0 的时候就进行回收,在垃圾回收的整个过程中,应用不需要挂起,如果去申请内存

2020-06-01 00:10:44 312

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除