宋学军java常见面试问题
Java常见面试问题 1、mysql读写分离,主从同步怎么配置的,如何降低延迟 读写分离配置在项目中我们配置了两个数据源,一个主数据库的,一个是从数据库的,在事务配置的时候,我们给从的数据dataSource配置了只读事务,在项目中根据操作判断注入不同的数据源,如果是增删改操作的注入主的数据源,所有的查询操作注入从的数据源,主从同步配置首先找到主数据库的my.ini文件,在里边配置server-id 每个数据库的server-id不能重复要保证唯一,配置binlog-do-db指明需要同步的数据库,log-bin来指明日志文件,配置完后,重启主数据库的服务,登陆主数据库,创建一个用于从数据库访问的用户,然后通过show master status;查询出主数据库的状态,记录下它的File和Position的值,紧接着配置从数据库,找到从数据库的my.ini文件,在里边配置server-id,log-bin和replicate-do-db 指明需要同步的数据库,然后重启从数据库的服务,重启完后登陆从数据库,创建从数据库对主数据库的连接,master_log_file要和刚才主数据库查询的File字段内容一致,master_log_pos要和主数据库刚才查出的Position一致,然后通过slave start,来启动从数据库,这样主从同步就配置好了。 如何降低延迟 1.主库和同库尽可能在同一个局域网内,交换机网卡采用千兆网卡。 2.主数据库更新完成之后产生的操作日志不是瞬间产生的,我们可以通过设置sync_binlog1, 让它瞬间产生磁盘日志,(n1指主数据库只要操作一次,就产生一次磁盘日志,n10,就是操作10次,产生一次),从数据库可以依赖磁盘日志,瞬间产生同步,可以达到减低延迟的效果。 3. 设置主库和从库读取日志失败之后,及时重新建立连接,延迟缩短。 2. nginxtomcat集群配置,如何解决session共享问题 首先开启每个tomcat的集群策略,在每个tomcat的service.xml中添加Cluster标签,然后在Engine标签里配置上jvmRoute,每台tomcat的jvmRoute配置的名称要一样,这样也就解决了session共享的问题了,nginx的话打开我们的nginx.conf配置文件,在里边配置集群的负载策略,nginx里边支持轮询、权重、ip_hash等策略,由于我门的服务器在硬件配置上一样,所以我们采了ip_hash策略,ip_hash 也就是说一个用户第一次访问nginx,nginx会将第一分发的请求服务器ip地址记录下来,下次访问的时候,发现之前有过访问,就会将第二次的访问还分发到第一次访问的服务器上。如果刚好分发的服务器宕机了,nginx就会自动给你分配到一个新的服务器上。 1.Tomcat中配jvmRote,jvmRoute配置的名称要一样 2、不使用session,换用cookie 3、session存在数据库(MySQL等)中 4、session存在memcache或者redis中 5.nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session 3、jvm优化 JVM 优化主要是解决java的 GC (垃圾回收)问题。 JVM 的使用过程中各代有,年轻带主要存放,新创建对象。 年老代,年老代存放从年轻代存活的 对象。Perm(持久代)用 于存放静态文件,如今Java类、方法等。一般持久代可以设置大一点。 GC优化的目的有两个 1、将转移到老年代的对象数量降低到最小; 2、减少full GC的执行时间; 为了达到上面的目的,一般地,你需要做的事情有 1、减少使用全局变量和大对象; 2、调整新生代的大小到最合适; 3、设置老年代的大小为最合适; 4、选择合适的GC收集器; 【垃圾回收(GC收集器)串行收集器、并行收集器、并发收集器。 串行处理器 --适用情况数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用。 --缺点只能用于小型应用 并行处理器 --适用情况“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例后台处理、科学计算。(例如 ERP 银行系统) --缺点应用响应时间可能较长 并发处理器 --适用情况“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例Web服务器/应用服务器、电信交换、集成开发环境。(例如互联网网站)】 5、设置jvm堆大小 ,32bit 1.5-2G ,64bit 可以超过 2G ,新版的JDK 每个线程的堆大小在1M改变这个线程所占用的堆大小,可以生成更多的线程,一般项目里线程数不能超过5000个。 3.1、堆和栈的区别 JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作以帧为单位的压栈和出栈操作。 差异 1.堆内存用来存放由new创建的对象和数组。 2.栈内存用来存放方法或者局部变量等 3.堆是先进先出,后进后出 4.栈是后进先出,先进后出 相同 1. 都是属于Java内存的一种2.系统都会自动去回收它,但是对于堆内存一般开发人员会自动回收它 3.2、怎么获取 Java 程序使用的内存堆使用的百分比 可以通过java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory 方法返回剩余空间的字节数,Runtime.totalMemory 方法总内存的字节数,Runtime.maxMemory 返回最大内存的字节数。 4.sql优化、数据库优化 SQL优化 1.sql的执行顺序select from 表名 where 条件 ,执行顺序是从后往前,where条件后面的语句尽可能缩短where 数据执行的范围。先group by 后order by select 查询 2.避免过多的联查,设计合理的表关系 3.遵守常见sql规范 4.如果表字段过多,经常展示的字段较少,对表进行纵切割。(从表的中间进行切割成两张表) 5.如果单个表的数量过大,利用业务逻辑采用横切割,例如腾讯qq采用位数分表,注册用手机号前三位来分表, 6.适度冗余减少关联查询 7.采用读写分离机制降低单个数据库压力 8.适当建立索引(数据超过5万条,十万条,才有作用,索引分为单个索引和复合索引,避免在索引列上使用计算和函数,这样索引就不能使用)提高查询效率。 9.通过开启慢日志查询定位执行速度慢的sql语句,进行分析 在my.ini中 开启慢日志 slow_query_lo