首页 > 其他 > 详细

学习笔记

时间:2020-02-29 01:29:37      阅读:55      评论:0      收藏:0      [点我收藏+]

类的加载过程,类加载器是什么东西,有几种类型

jvm调优
选择jvm版本,client、server
堆区大小的指定
合理的选择收集器
小工具
jps.ext:打印jvm进程(对比linux的PS打印linux进程),如:jps -l -v
jstat.exe:查看jvm运行时信息,如查看jvm进程的gc信息,100毫秒一次,循环打印20次:jstat -gc pid 100 20
jvisualvm:最欠打的运行监视和故障处理工具,可以监控内存泄漏跟踪垃圾回收,执行内存分析,cpu分析,线程分析
记得添加Visual GC插件,更加清晰
jvm参数
内存参数
-Xms:初始堆大小,包括年轻代和老年代
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:年轻代和老年代的比值
-XX:SurvivorRatio=n:年轻代中Eden与两个SurvivorRatio的比值
-XX:MaxPermSize=n:设置持久代的大小
收集器参数
-XX:+UserSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置老年代并行收集器
-XX:+UseConcmarkSweepGC:设置老并发收集器
......
备注
实际中,设置堆初始内存-Xms,堆最大内存-Xmx,新生代内存-Xmn;新生代和老年代1:2或1:3
尽量让对象留在新生代,因为老年代是Full GC,比较耗费性能
远程监控jvm
jststd:服务端执行jstatd,然后本地用jvisualvm客户端添加远程主机就可以了(可以使用visual GC插件,推荐用)
jmx:需要对每个jvm虚拟机添加启动参数(可以看cpu)

jvm构成
类加载器;
方法区(类加载后进入,字段,方法,常量池)
堆内存(实例),本地内存(jvm之外的内存区域);
方法栈(局部变量,参数),本地栈(操作系统相关的操作);
垃圾回收系统;
执行引擎

jvm内存分代
提高内存分配和垃圾回收效率
新生代:可以频繁gc,回收大部分内存,新生代复制到老年代的过程还能起到消除内存碎片的作用
老年代:多次垃圾回收存活下来的对象,gc频率相对较低
永久代:几乎不做gc

垃圾回收算法
引用算法;被引用则计数加1,计数为0则会被回收
复制算法:把内存分成两块相等的空间,遍历所有对象,把正在使用的对象复制到另一块内存,同时可以整理内存碎片
标记清除:☆从根节点开始标记被引用的对象,然后把未标记的对象删除,缺点是需要暂定应用,且会产生内存碎片
标记整理:☆结合了复制算法和标记整理算法,即执行标记清除后,再把对象按顺序排放(注意不是放到另一块内存区域)

垃圾回收器
垃圾回收流程
新生代在一次垃圾回收开始时,新生代中只有Eden和S0中有对象,垃圾回收器会把Eden中的大部分对象回收,剩下的会全部进入S1,S0中的对象会根据是否达到计数器(没躲过一次GC的对象计数加1)的阈值,一般是15,
如达到阈值则进入老年代,否则进入S1,最后会把S0和S1交换,另外如果S1空间不足后,也会自动转移到老年代;这样结束后,还是只有Eden和S0有对象;
老年代的GC频率相对较低,回收速度也会慢
大类
次收集器:年轻代空间紧张时会触发,间隔时间短
全收集器:老年代或持久代空间满了会触发,可使用System.gc()显示启动全收集
细分
新生代收集器
serial串行收集器:需要暂停用户线程,也叫Stop The World,新生代用复制算法,老年代用标记整理算法
ParNew并行收集器:利用了服务器多核,serial的升级版,缩短了SWT时间,还是存在SWT的问题
Parallel Scavenge:关注的不是收集时间,关注的是吞吐量
老年代收集器
serial old:类似serial
Parallel Old:类似Parallel
CMS收集器:☆真正的并发收集器,最短的SWT时间
G1收集器:可以用在新生代和老年代

JMM内存模型
jvm同步锁相关,同步机制,锁升级原理
hashmap hashtable hash碰撞
java文件怎么从磁盘一步步加载到jvm内存里面
手写单例,其他实现
spring,Mybatis(基本都是mybatis),spring boot jpa,spring boot,sharding-jdbc
redis,memcache
activemq,rocketmq,kafka(问的比较多,如怎么保证消息顺序性)
如何实现的百万级消息吞吐,kafka实现

mysql事务隔离级别
脏读:可以读取别人未提交的数据
不可重复读:主要针对更新一条数据,如事务A读取了一条数据后,事务B对该数据进行了修改,此时事务A再次读取时发现数据不一致;解决办法是事务A读取数据后,对单条数据进行锁定,防止事务B改变改条数据
幻读:主要针对插入和删除,如事务A按某个条件查询了一批数据,事务B对条件中的一个数据执行了新增或者删除,此时事务A查询的数据就和数据库不一致;解决办法是锁定整个表
读未提交:存在脏读、不可重复读、幻读三个问题
读已提交:解决了脏读
可重复读:解决了脏读和不可重复读
串型化:解决了所有问题,效率最低

mysql索引原理,怎么实现的
B+树
从二叉查找数延伸,二叉树原理?二叉树也有局限性,就是近端情况下,高度太高,所以有了平衡二叉树,红黑树是一种不完全的平衡二叉树
每个想象成一个磁盘块;每个节点中数据量由阶数决定;非叶子节点只有指针索引信息;查询速度由树的高度决定,B+树高度固定;由于叶子节点是全量数据且有序,所以范围查找会很快;
SQL优化
不要用select *,因为查当行记录是耗时的,同步无法应用覆盖索引;
where尽量不用null值判断,因为会不走索引导致全表扫描;
使用联合索引的时候,遵循左侧前缀法则,常用的放左边

MongoDB索引怎么实现的,和mysql的区别
sql性能调优,mysql执行计划怎么看
mysql如何主从同步,大概的实现方法
数据库分库分表怎么做
分布式锁
分布式事务(创建订单,扣减库存)
lombok实现原理
理论:开闭原则

linux部署命令
jps -l 查看java进程
kill -9 pid 杀进程
nohup java -jar ruoyi-admin.jar > /dev/null 2>&1 & 部署后台进程

spring mvc
spring可以创建父子容器,子可以访问父,父不可以访问子,如ContextLoaderListener创建dao、service,DispatcherServlet创建controller,则springmvc可以访问dao、service
流程
DispatchServlet:接受请求的顶级前端控制器
HandlerMapping:根据请求uri返回方法调用链,包含拦截器
HandlerAdapter:类似把请求适配到servlet上面去执行
Handler:DispatchServlet前端控制器的后端控制器,也就是用户写的controller,一个handler对象处理所有请求,所以是线程不安全的,也就是controller中定义实例变量也是不安全的,经测试这一点和asp.net webapi不同
ViewResolver

spring
lookup-method:通过配置的方式,自动使用cglib动态实现抽象方法,创建子类型,是工厂方法的扩展

spring aop表达式
execution:最通用的
target:目标对象
this:通知对象
whitin:包名
args:参数

mybatis插件
Interceptor:数据权限过滤、分页、sql执行时间性能监控,使用场景不多,市场用的多的只有PageHelper
generator:自动生成mapper配置文件和mapper接口

学习笔记

原文:https://www.cnblogs.com/yinchh/p/12381174.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!