1、Linux查看日志的三种命令:
第一种:查看实时变化的日志(比较吃内存)
第二种:搜索关键字附近的日志
2、输入“/关键字”,按enter键查找
3、查找下一个,按“n”即可
退出:按ESC键后,接着再输入:号时,vi会在屏幕的最下方等待我们输入命令
/关键字 注:正向查找,按n键把光标移动到下一个符合条件的地方
?关键字 注:反向查找,按shift+n 键,把光标移动到下一个符合条件的
2、Linux查看进程命令
-u,以用户(user)的格式显示
-x, 显示后台进程运行参数
-ef,以全格式显示进程所有信息,包括父进程Pid,创建人,创建时间,进程号。等等
一般项目中,我们首先要查询一个进程,并对其进行删除会用一下命令
查询到helloworld相关的进程,我们通过kill命令来操作该进程号删除该进程,kill -9 13492
3、HTTP、HTTPS等常用的默认端口号
1,HTTP服务器,默认端口号为80/tcp(木马Executor开放此端口)
4,SOCKS代理协议服务器常用端口号:1080
5,FTP(文件传输)协议代理服务器常用端口号:21
6,Telnet(远程登录)协议代理服务器常用端口号:23
10,SSH(安全登录)、SCP(文件传输)、端口号重定向,默认的端口号为22/tcp
http协议和https协议的区别:传输信息安全性不同、连接方式不同、端口不同、证书申请方式不同
一、传输信息安全性不同
1、http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。
2、https协议:是具有安全性的ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全。
1、http协议:http的连接很简单,是无状态的。
2、https协议:是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。
1、http协议:使用的端口是80。
2、https协议:使用的端口是443.
1、http协议:免费申请。
2、https协议:需要到ca申请证书,一般免费证书很少,需要交费。
5、数据库的内连接和外连接有什么区别?
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
内连接,即最常见的等值连接,例:
内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
代码中存在死循环或循环产生过多重复的对象实体;
使用的第三方软件中的BUG;
启动参数内存值设定的过小;
堆:设置JVM值得方法是通过-XMS(堆的最小值),-XMX (堆的最大值)
栈:设置栈的的大小方法是-XSS参数
PermGen space:第三个异常是关于perm的异常内容,我们需要的是设置方法区的大小,
内存使用监控工具jvmstat
只有and
和or
同时出现时才会走复合索引 但是具体要看mysql分析器
尽可能让所有的数据检索都通过索引来完成,从而避免Innodb
因为无法通过索引键加锁而升级为表级锁定;
合理设计索引,让Innodb
在索引键上面加锁尽可能准确,尽可能的缩小锁定范围,避免造成不必要的锁定而影响其他Query
的执行;
尽可能减少基于范围的数据检索过滤条件,避免间隙锁带来的负面影响而锁定了不该锁定的记录;
尽量控制事务的大小,减少锁定的资源量和锁定时间长度;
在业务环境允许的情况下,尽量使用较低级别的事务隔离,以减少MySQL因为实现事务隔离级别所带来的附加成本;
方式一:继承Thread类,重写run方法
劣势:单继承的限制——无法继承其他父类,同时不能实现资源共享
方式二:实现Runnable接口,并实现run方法
优势:可以继承其他类,多线程可以共享一个Thread对象;
1、多线程编程的三个核心概念
原子性这一点,类比数据库事务的原子性;即一个操作,也有可能是一组操作,要么全部生效,要么全部失效。 关于原子性,一个非常经典的案例就是银行卡之间转账的问题:比如A和B同时向C转账10万元。如果转账操作不具有性,A在向C转账时,读取了C的余额为20万,然后加上转账的10万,计算出此时应该有30万,但还未来及将30万写回C的账户,此时B的转账请求过来了,B发现C的余额为20万,然后将其加10万并写回。然后A的转账操作继续——将30万写回C的余额。这种情况下C的最终余额为30万,而非预期的40万。
可见性当多个线程并发访问共享变量时,一个线程对共享变量的修改,其它线程能够立即看到。可见性问题是好多人忽略或者理解错误的一点。 CPU从主内存中读数据的效率相对来说不高,现在主流的计算机中,都有几级缓存。每个线程读取共享变量时,都会将该变量加载进其对应CPU的高速缓存里,修改该变量后,CPU会立即更新该缓存,但并不一定会立即将其写回主内存(实际上写回主内存的时间不可预期)。此时其它线程(尤其是不在同一个CPU上执行的线程)访问该变量时,从主内存中读到的就是旧的数据,而非第一个线程更新后的数据。这一点是操作系统或者说是硬件层面的机制
顺序性指的是,程序执行的顺序按照代码的先后顺序执行。如下面这段代码
从代码顺序上看,上面这4条语句应该一次执行,但实际上JAVA 虚拟机真正执行这段代码时,并不保证他们一定按顺序执行。处理器为了提高程序整体的执行效率,可能会对代码进行优化,其中一项优化方式就是调整代码顺序,按照更高效的顺序执行代码。讲到这里,我曾经问过自己,CPU不按照我的代码顺序执行,那怎么保证得到我们想要的结果?实际上,CPU 虽然不保证完全按照代码顺序执行,但他会保证程序的最终执行结果和代码顺序执行结果一致。
#方式能够很大程度防止sql注入,方式一般用于传入数据库对象,例如传入表名。
从安全性上考虑,能使用#尽量使用#来传参,因为这样可以有效防止SQL注入的问题。
MyBatis排序时使用order by 动态参数时需要注意,用{columnName} //这里MyBatis不会修改或转义字符串,可实现动态传入排序。
建议:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。
这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。