java的jvm和事务并发的关系_Java程序员岗面试总结

1.分布式事务

事务就是一个会话过程中,对上下文的影响是一致的,要么所有的更改都做了,要么所有的更变都撤销掉。就要么生,要么死。没有半死不死的中间不可预期状态。

事务是为了保障业务数据的完整性和准确性的。

分布式事务,常见的两个处理办法就是两段式提交和补偿。

两段式提交典型的就是XA,有个事务协调器,告诉大家,来都准备好提交,大家回复,都准备好了,然后协调器告诉大家,一起提交,大家都提交了。

补偿比较好理解,先处理业务,然后定时或者回调里,检查状态是不是一致的,如果不一致采用某个策略,强制状态到某个结束状态(一般是失败状态),然后就世界太平了。典型的就是冲正操作。

准备好了以后,如果没有问题,收到提交,所有人都开始提交。

这个时候,比如对数据库来说,有redo日志的。

如果某个数据库这时候宕机了,那么它重启的时候,先执行检查,也会把上一次的这些操作都提交掉的。所以各个点的数据都是一致的。

2.多线程

2.1 多线程编程的好处是什么?

在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。

2.2我们如何创建一个线程?

一是实现Runnable接口(好因为还可以继承),然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类。

Java 多线程并发编程会有许多不同的问题,主要有如下问题的应用:

多线程读写共享数据同步问题

并发读数据,保持各个线程读取到的数据一致性的问题。

解决方案:

synchronized关键字和Lock并发锁:主要解决多线程共享数据同步问题。

ThreadLocal主要解决多线程中数据因并发产生不一致问题。

3.中间件

Java中间件技术主要就是EJB,如果说服务器主要有tomcat、weblogic、webshpere,JBoss等。

4.并发解决方案

基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。

f5负载均衡

redis

5.系统应用架构

6.JVM 内存调优

eclipse中:window-preferences-java-jre-jdk中 vm 参数

was中:中间件服务器-应用-进程定义-java虚拟机中

初始堆大小(1024M)最大堆大小(1536M)通用JVM参数-XX:MaxPermSize=256M

6.1.JVM内存管理的机制

内存空间划分为:Sun JDK在实现时遵照JVM规范,将内存空间划分为堆、JVM方法栈、方法区、本地方法栈、PC寄存器。 配置-Xms512m

-Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256M

堆:堆用于存储对象实例及数组值,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中对象所占用的内存由GC进行回收,在32位操作系统上最大为2GB,在64位操作系统上则没有限制,其大小可通过-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1GB;-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于1GB。

JVM方法栈:为线程私有,其在内存分配上非常高效。当方法运行完毕时,其对应的栈帧所占用的内存也会自动释放。当JVM方法栈空间不足时,会抛出StackOverflowError的错误,在Sun

JDK中可以通过-Xss来指定其大小。

方法区:要加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。方法区域也是全局共享的,在一定条件下它也会被GC,当方法区域要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。在Sun

JDK中这块区域对应Permanet

Generation,又称为持久代,默认最小值为16MB,最大值为64MB,可通过-XX:PermSize及-XX:MaxPermSize来指定最小值和最大值。

PC寄存器:占用的可能为CPU寄存器或操作系统内存。

6.2.Java堆和栈的区别

Java把内存划分成两种:一种是栈内存,一种是堆内存。

在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

6.3.Java内存泄露和内存溢出

内存泄漏:分配出去的内存回收不了

内存溢出:指系统内存不够用了

6.4.Java类加载机制

JVM将类加载过程划分为三个步骤:装载、链接和初始化。

6.5.内存回收

7.线程池

什么叫线程池,线程池作用?什么是连接池,连接池作用?

线程池就是申请固定数目的线程,放在某个空间中。当申请线程时,就从线程池中取得。当线程池中的线程都被占用的时候,无法获取到新的线程。通过ThreadPoolExecutor来创建一个线程池连接池是数据库连接池,跟线程池原理一样。目的都是一样的,防止链接过多造成压力。

8.自己攻克的难题

9.性能调优

9.1数据库调整

9.1.1 sequence缓存的增加

9.1.2 增加日志大小与数量,并且将日志文件与数据文件磁盘分离,减少io写争抢

9.1.3 调整缓冲池大小

9.1.4 打开数据库的脏读回写

9.2was参数调整

9.2.1 线程池调整 服务器—所有服务器—dbank-provider—线程池—WebContainer

100并发50/300,300并发50/600;

9.2.2 JVM调整

服务器—所有服务器—dbank-provider—Java和进程管理—进程定义—Java虚拟机,修改初始堆大小与最大堆大小(1024M/2048M)

通用JVM参数填入额外参数(-XX:MaxPermSize=256M);

9.2.3 JDBC连接池调整 资源—JDBC—数据源—dbank_ds—连接池属性,修改最小连接数与最大连接数

100并发10/300,300并发10/600;

9.2.4 系统日志大小及个数 故障诊断—日志和跟踪—服务器名(如dbank-provider)—JVM日志

将SystemOut.log与SystemErr.log最大大小修改为200MB,历史日志文件最大数为20个。

9.2.5 修改数据库隔离级别

资源—JDBC—数据源—dbank_ds—定制属性—webSphereDefaultIsolationLevel(需翻页)将默认级别4修改为2。

9.2.6 修改应用日志缓存大小

修改应用中(直销银行、电子账户、产品中心)日志配置文件logback.xml中的quenceSize从10240修改为1024。

9.3添加索引

9.4代码调优

10.你说说你做的最好的项目?

要重点介绍到

①项目是做什么?

②用到那些技术?

③整个项目中最大的亮点是?核心部分

④遇到bug是怎么解决的?

例如:我认为我做的最好的项目是电子账户系统,电子账户类似于支付宝,是**银行直销银行的账务支撑系统。分为账户管理、记账、对账、日终跑批、报表统计等模块。目前生产用户数量在六七万左右。使用技术IFP(基于Spring)+Maven,生产中配置两台应用服务器,使用F5负载均衡,配置虚地址,由F5分发到两台服务器。

你项目遇到bug?怎么查问题?

例如:首先遇到了bug,会查询日志,通过日志定位到某个类的行数,判断是否有代码问题。

你遇到了什么bug?你是怎么解决?

例如我自己项目中,查询量非常大。通过日志发现了堆内存溢出,最后通过优化代码,减轻new和加大堆内存。

数据源方式锁表,由于db2默认隔离级别4较高,改为2。

批量扣划时间超长导致规定时间没有取到文件改为主动通知方式。

连接数不够调优。

11.java的数据结构

java.util包中三个重要的接口及特点:List(列表)、Set(保证集合中元素唯一)、Map(维护多个key-value键值对,保证key唯一)。其不同子类的实现各有差异,如是否同步(线程安全)、是否有序。

12.java中常用的类,包,接口

类:String Integer Long File Date Thread

包:

第一个包:java.lang包

该包提供了Java语言进行程序设计的基础类,它是默认导入的包。该包里面的Runnable接口和Object、Math、String、StringBuffer、System、Thread以及Throwable类需要重点掌握,因为它们应用很广。

第二个包:java.util包

该包提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。

第三个包:java.io包 该包通过文件系统、数据流和序列化提供系统的输入与输出。

第四个包:java.sql包

第五个包:java.NET包

第六个包:java.math包;

接口:Comparable Collection Map List Runnable

13.https通讯原理:

Http传输数据不加密,明文,通信端口80;而Https在数据通信之前需要客户端、服务器进行握手(身份认证),建立连接后,传输数据经过加密,通信端口443。

原理:1.客户端发起HTTPS请求;2、服务端的配置;3、传送证书;4、客户端解析证书;5、传送加密信息;6、服务段解密信息;7、传输加密后的信息;8、客户端解密信息

14系统调优:

通常的性能瓶颈:cpu,内存,io,带宽

vmstat 全面的性能查看工具

netstat网络相关查看工具

top 与进程相关的性能查看工具

iostatio性能查看工具

ps 进程查看工具

iftop 网络带宽查看工具

vi/find/awk/lsof/free编辑器/查找命令/文本过滤/查看进程打开文件进程情况/内存查看

查看端口

96055867_1.jpg

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值