1、以下哪些建议能防止内存溢出(ABD)
A、数据库批量提交时,每个批量的数量不得超过1000
B、必须使用EXCEL时建议使用com.alibaba.easyexcel
C、避免使用全局对象,避免使用大对象,避免使用单例对象
D、调用后台、外系统接口时,必须使用分页、数据筛选等手段以降低返回结果集的空间占用
内存溢出:程序申请的内存超过JVM堆的最大限制
2、以下说法正确的是(D)
A、fastjson最低版本要求为1.2.75
B、在多线程中共享Random可能会导致多个线程生成相同的随机序列
C、Mybatis中,$符号可以防止SQL注入
D、外部请求下载文件时,需要避免由外界指定文件名
Random类在多线程环境下是不安全的,多个线程同时调用Random实例的方法可能会导致数据不一致或者产生重复的随机数。Random类的实例包含一个种子值(seed),这个种子值会影响生成的随机数序列。在多线程环境下,多个线程同时访问同一个Random实例时,由于种子值的共享,可能会导致多个线程生成相同的随机数序列。
为了解决Random线程不安全的问题,可以使用ThreadLocal来保证每个线程拥有自己的Random实例。这样可以避免多个线程之间的种子值共享,从而确保线程安全。
多线程共用一个实例时是安全的,多线程各自建一个Random实例可能生成重复随机数。
3、以下JVM参数含义正确的是(AD)
A、-XX:+HeapDumpOnOutOfMemoryError:配置后当发生 OOM(OutOfMemory)时,会自动转储堆内存快照dump文件
B、-Xms:设置JVM堆内存的最大值
C、-Xmx:设置JVM堆内存的初始大小,也是堆内存大小的最小值
D、-Xss:每个线程的堆栈大小
4、以下哪些类是不安全的(A)
A 、SimpleDateFormat B、SecureRandom C、ThreadLocal D、DateTimeFormatter
SimpleDateFormat类的内部有一个Calendar对象引用,这个对象主要用来储存和这个SimpleDateFormat相关的日期信息。把SimpleDateFormat作为多个线程的共享资源来使用的时候,那就意味着多个线程之间会共享这个SimpleDateFormat里面的Calendar引用。如果多个线程同时于操作这个Calendar对象的情况下,就会出现数据脏读的现象,从而导致一些不可预料的错误。
①可以把SimpleDateFormat定义成非全局使用的局部变量,这样每个线程调用的时候都创建一个新的实例。②可以使用ThreadLocal,把SimpleDateFormat变成一个线程私有的对象。③定义SimpleDateFormat的时候,加上同步锁,这样就能够保证在同一时刻只允许一个线程操作。④使用Java 8的新特性,在Java8中引入了一些线程安全的日期操作API,比如LocalDateTimer、DateTimeFormatter 等等。
5、以下哪些是不安全的加密算法或摘要算法(AB)
A、MD5算法
B、DES算法
C、长度1024位的RSA算法
D、SM4算法
MD5(Message-Digest Algorithm 5)-这是一种广泛使用的哈希函数,但因为其易于碰撞攻击,已不适合用于密码存储等安全性要求高的场合。
DES (Data Encrvption Standard)-虽然曾经是标准,但它的密钼长度较短(64位),现在被认为相对容易被暴力破解。
RSA-原本是安全的公钥加密系统,但如果密钥管理不当(如选择过短的密钥、密钥泄露等),也可能变得不安全。
6、以下描述正确的是(ACD)
A.SQL中的select语句避免使用 * (全字段)字符查询,需填写所使用每个字段名称
B.悲观锁完全保证数据的独占性、正确性,但对性能影响较大,甚至可能出现死锁,适用于相对多读少写的场景
C.一般交易量较大的产品不使用数据库的自定义函数、触发器、存储过程等
D.核心交易业务建议不用分库分表,容易出现查询时出现不幂等
悲观锁:在整个数据处理过程中,将共享资源进行加锁,以防止其他线程的干扰。
实现:通常通过数据库的行锁或者Java中的synchronized关键字来实现。在悲观锁的情境下,线程认为在执行期间其他线程可能会修改共享资源,因此在访问共享资源之前,先获取锁,确保自己是独占资源的。
乐观锁:乐观锁的基本思想是,在整个数据处理过程中,不对共享资源进行加锁,而是在访问时假设其他线程不会修改共享资源,只有在真正更新时才检查是否有冲突。
实现: 乐观锁的实现通常依赖于数据版本控制,通常通过版本号(版本控制)或者CAS(Compare and Swap)等机制来实现。在乐观锁的情境下,线程在读取共享资源时不会加锁,而是在更新时检查是否有其他线程修改过,如果有,则进行相应处理。
7、日志规约描述错误的是(AD)
A、打印日志直接调用Log4j、Logback的 API进行打印
B、在日志输出时,字符串变量之间的拼接使用占位符的方式
C、对于 trace/debug/info 级别的日志输出,必须进行日志级别的开关判断
D、避免重复打印日志,浪费磁盘空间,务必在 log4j.xml 中设置 additivity=true
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);如果日志级别是 warn,上述日志不会打印,但是会执行字符串拼接操作,如果 symbol 是对象,会执行 toString() 方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。
8、跨系统(多个系统链路)调用时的超时控制原则
跨系统调用时,调用方与被调用方应至少有一方具有超时控制的机制,并且超时设置在交易路径上原则上要求超时时间由前到后逐渐减小(遵循漏斗原则)。