【每日面经4.18】

为什么要用Redis ?

解决性能和并发问题,nginx也是解决并发问题的

如何解决Reids缓存问题?

https://zhuanlan.zhihu.com/p/81195864在这里插入图片描述

企业级解决并发问题?

实际上就可以答nginx的负载均衡,redis的缓存机制,读写分离机制

innodb行锁

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与ORACLE不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

走索引不需要全表扫描所以是特定的行就行了!

在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。下面我们通过一些实际例子,来加以说明。

(1)在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行锁。

下面的例子中,开始tab_no_index表没有索引:

mysql> create table tab_no_index(id int,name varchar(10)) engine=innodb;

Query OK, 0 rows affected (0.15 sec)

mysql> insert into tab_no_index values(1,'1'),(2,'2'),(3,'3'),(4,'4');

Query OK, 4 rows affected (0.00 sec)

Records: 4 Duplicates: 0 Warnings: 0

                 InnoDB存储引擎的表在不使用索引时使用表锁例子                   

session_1

session_2

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from tab_no_index where id = 1 ;

±-----±-----+

| id | name |

±-----±-----+

| 1 | 1 |

±-----±-----+

1 row in set (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from tab_no_index where id = 2 ;

±-----±-----+

| id | name |

±-----±-----+

| 2 | 2 |

±-----±-----+

1 row in set (0.00 sec)

mysql> select * from tab_no_index where id = 1 for update;

±-----±-----+

| id | name |

±-----±-----+

| 1 | 1 |

±-----±-----+

1 row in set (0.00 sec)

mysql> select * from tab_no_index where id = 2 for update;

什么时候索引失效

tomcat如何启动的

在这里插入图片描述
整个tomcat是一个Server容器,Server负责调用Service对外提供服务,Servce封装了engine与connector,connect负责接受请求,engine负责处理请求。
当一个request过来的时候,首先判断协议和端口(选定connector),紧接着根据ip地址找到host,再根据uri找到context就找到了webapplocation。

nginx和tomcat的区别

刚才在某论坛看见一个问题,Nginx(Apache)与Tomcat的异同,我发现很多回答真的是答非所问,什么都是Apache基金会下的项目啥的,当然说的是没错,但是读后还是不知道这两者有啥区别,这里我根据我自己的经验来简单描述一下两者的区别,

总的来说,Apache或者Nginx 是HTTP Server,Tomcat 则是一个Application Server也有人说是Web Server,但本质上它是一个Servlet/JSP应用的容器,顺便说一句,GlassFish以前版本的Servlet容器实现就直接用的Tomcat。一个 HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,所以在 Apache/Nginx 上你可以看到代理、负载均衡等功能。客户端通过 HTTP Server 访问服务器上存储的资源(HTML 文件、图片文件等等)。通过 CGI 技术,也可以将处理过的内容通过 HTTP Server 分发,但是一个 HTTP Server 始终只是把服务器上的文件如实的通过 HTTP 协议传输给客户端。

而应用服务器,顾名思义是一个应用的容器。它首先需要支持开发语言的 Runtime环境(对于 Tomcat 来说,就是 Java),保证应用能够在应用服务器上正常运行。其次,需要支持应用相关的规范,例如类库、安全方面的特性。对于 Tomcat 来说,就是需要提供 JSP/Sevlet 运行需要的标准类库、Interface 等。为了方便,应用服务器往往也会集成 HTTP Server 的功能,但是不如专业的 HTTP Server 那么强大,所以应用服务器往往是运行在 HTTP Server 的背后,执行应用,将动态的内容转化为静态的内容之后,通过 HTTP Server 分发到客户端。

这也是为什么Nginx往往与Tomcat配合使用的原因。

计算机网络每层协议

在这里插入图片描述
TCP/IP:
数据链路层:ARP,RARP
网络层: IP,ICMP,IGMP
传输层:TCP ,UDP,UGP
应用层:Telnet,FTP,SMTP,SNMP.

OSI:
物理层:EIA/TIA-232, EIA/TIA-499, V.35, V.24, RJ45, Ethernet, 802.3, 802.5, FDDI, NRZI, NRZ, B8ZS
数据链路层:Frame Relay, HDLC, PPP, IEEE 802.3/802.2, FDDI, ATM, IEEE 802.5/802.2
网络层:IP,IPX,AppleTalk DDP
传输层:TCP,UDP,SPX
会话层:RPC,SQL,NFS,NetBIOS,names,AppleTalk,ASP,DECnet,SCP
表示层:TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption,MPEG,MIDI,HTML
应用层:FTP,WWW,Telnet,NFS,SMTP,Gateway,SNMP

java内存泄漏

https://zhuanlan.zhihu.com/p/368830445

3.1 代码中没有及时释放,导致内存无法回收。

下面的代码,因为是双向链表,但是断开的不够彻底,prev节点依然引用这当前正在使用的节点,导致无法回收

public class ListNode {
int val;
ListNode next;
ListNode prev;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next, ListNode prev) {
this.val = val;
this.next = next;
this.prev = prev;
}
public static void main(String[] args) {
ListNode curr = new ListNode(1);
ListNode prev = new ListNode(2);
ListNode next = new ListNode(3);
curr.prev = prev;
curr.next = next;
curr.prev = null;
}
}

内存泄漏的解决办法
1.尽量减少使用静态变量,或者使用完及时 赋值为 null。

2.明确内存对象的有效作用域,尽量缩小对象的作用域,能用局部变量处理的不用成员变量,因为局部变量弹栈会自动回收;

3.减少长生命周期的对象持有短生命周期的引用;

4.使用StringBuilder和StringBuffer进行字符串连接,Sting和StringBuilder以及StringBuffer等都可以代表字符串,其中String字符串代表的是不可变的字符串,后两者表示可变的字符串。如果使用多个String对象进行字符串连接运算,在运行时可能产生大量临时字符串,这些字符串会保存在内存中从而导致程序性能下降。

5.对于不需要使用的对象手动设置null值,不管GC何时会开始清理,我们都应及时的将无用的对象标记为可被清理的对象;

6.各种连接(数据库连接,网络连接,IO连接)操作,务必显示调用close关闭。

实际开发中有什么是平时用一两次问题不大,但是用的多会造成性能的问题?

String喽?看上面的第四条

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值