有的VPS服务商提供的VM实例上出于安全性考虑,只允许通过ssh key登录并禁用了root登陆。对安全性要求不高的话没必要通过ssh key那么麻烦,以下是开启密码登陆与root登陆流程。

1、通过sudo su命令切换到root用户

sudo su //切换到root用户

2、修改SSH配置文件/etc/ssh/sshd_config

vi /etc/ssh/sshd_config //编辑文件
找到PermitRootLogin和PasswordAuthentication

Authentication:

LoginGraceTime 120
PermitRootLogin yes //默认为no,需要开启root用户访问改为yes
StrictModes yes

Change to no to disable tunnelled clear text passwords

PasswordAuthentication yes //默认为no,改为yes开启密码登陆

3、重启SSH服务使修改生效.

/etc/init.d/ssh restart
4、进行以下操作,可使用XShell等客户端通过用户名和密码访问实例

如果想使用root密码登陆,需要设置root用户密码,完成后即可使用root密码访问实例。

passwd root

选择合适的字段,比如邮箱字段可以设为char(6),尽量把字段设置为notnull,这样查询的时候数据库就不需要比较null值

使用关联查询( left join on)查询代替子查询

使用union联合查询手动创建临时表

开启事物,当数据库执行多条语句出现错误时,事物会回滚,可以维护数据库的完整性

使用外键,事物可以维护数据的完整性但是它却不能保证数据的关联性,使用外键可以保证数据的关联性

使用索引,索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快的多的速度检索特定的行,特别是对于max,min,order by查询时,效果更明显

优化查询语句,绝大多数情况下,使用索引可以提高查询的速度,但如果sql语句使用不恰当的话,索引无法发挥它的特性。

第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 
第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

垃圾回收的过程首先就是要确定对象是否是垃圾对象,如果是垃圾对象,垃圾回收器才会进行回收。垃圾回收主要又两种算法:引用计数算法和可达性分析算法。

一、引用计数算法
引用计数算法就是在对象中添加了一个引用计数器,当有地方引用这个对象时,引用计数器的值就加1,当引用失效的时候,引用计数器的值就减1。当引用计数器的值为0时,jvm就开始回收这个对象。

简单的来说,在JVM中的栈中,如果栈帧中指向了一个对象,那么堆中的引用计数器的值就会加1,当栈帧这个指向null时,对象的引用计数器就减1。

这种方法虽然很简单、高效,但是JVM一般不会选择这个方法,因为这个方法会出现一个问题:当对象之间相互指向时,两个对象的引用计数器的值都会加1,而由于两个对象时相互指向,所以引用不会失效,这样JVM就无法回收。

二、可达性分析算法
针对引用计数算法的BUG,JVM采用了另一种方法:定义一个名为"GC Roots"的对象作为起始点,这个"GC Roots"可以有多个,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,即可以进行垃圾回收。

在上图中可以看到,如果时选用引用计数算法,object5, object6, object7之间互相引用,所以无法被回收。但是如果选用了可达性分析算法,虽然他们之间时相互引用,但是他们没有任何引用链和GC Roots连接,所以是可回收对象。

GC Roots对象一般包括有:
1.虚拟机栈(栈帧中本地变量表)中引用的对象;
2.方法区中类静态属性引用的对象;
3.方法区中常量引用的对象;
4.本地方法栈中JNI(Native方法)引用的对象。

三、拓展
对象被回收前的挣扎
在可达性分析算法中不可达的对象,并不是直接被回收,这时它们处于缓刑状态,至少需要进行两次标记才会确定该对象是否被回收:
 第一次标记:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记;
 第二次标记:第一次标记后接着会进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法(该方法可将此对象与GC Roots建立联系)。在finalize()方法中没有重新与引用链建立关联关系的,将被进行第二次标记。

 第二次标记成功的对象将真的会被回收,如果对象在finalize()方法中重新与引用链建立了关联关系,那么将会逃离本次回收,继续存活。如果没有建立联系, 在finalize()方法中执行该对象必须要执行的代码(因为该对象马上就要被回收),例如释放资源,这与try finally中finally的作用是一样的

方法区如何判断是否需要回收
方法区存储内容是否需要回收的判断可就不一样咯。方法区主要回收的内容有:废弃常量和无用的类。对于废弃常量也可通过引用的可达性来判断,但是对于无用的类则需要同时满足下面3个条件:

该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;
加载该类的ClassLoader已经被回收;
该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
————————————————
版权声明:本文为CSDN博主「-小酒窝-」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zx1293406/article/details/104535414

通过一系列的称为GC Roots的对象作为起始点,从这些节点开始往下搜索,搜索所走过的路径叫做引用链,当一个对象到GC Roots没有任何引用链相连的时候,则证明此对象是不可用的。

在java中,可作为GC Roots的对象有以下几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象。
方法区中类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI引用的对象。