面试题目补充

1.Spring 的 AOP 关于拦截 private 方法一些问题

用 java 反射机制可以获取 private 修饰的方法,进行拦截。注意,私有构造函数需要设置使用权限conInt.setAccessible(true);否则报错


2.项目中数据字典怎么做的缓存,如何做的通信,有没有用什么模块。


3. spring 事务传播行为的配置方法:

(1)spring 对事务传播行为和隔离级别的二次封装。因为不同项目可能在一个 mysql 的不同数据库上,所以可以在项目中配置数据库的传播行为和隔离级别

<property name="transactionAttributes"> 
<props> 
<prop key="save*">PROPAGATION_REQUIRED</prop> 
<prop key="update*">PROPAGATION_REQUIRED</prop> 
<prop key="delete*">PROPAGATION_REQUIRED</prop> 
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> 
<prop key="find*">PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED</prop>
</props>

(2)另一种方式:

事务的传播性:@Transactional (propagation=Propagation.REQUIRED)

事务的隔离级别:@Transactional (isolation = Isolation.READ_UNCOMMITTED)

(3)spring+mybatis 事务配置

        <!-- 定义事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!--使用注释事务 -->
	<tx:annotation-driven  transaction-manager="transactionManager" />

4.slf4j 的原理,和 log4j 的对比

SLF4J 不同于其他日志类库,与其它有很大的不同。SLF4J (Simple logging Facade for Java) 不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志类库。

如果一个项目已经使用了 log4j,而你加载了一个类库,比方说 Apache Active MQ—— 它依赖于于另外一个日志类库 logback,那么你就需要把它也加载进去。但如果 Apache Active MQ 使用了 SLF4J,你可以继续使用你的日志类库而加载和维护一个新的日志框架。

总的来说,SLF4J 使你的代码独立于任意一个特定的日志 API,这是一个对于开发 API 的开发者很好的思想。虽然抽象日志类库的思想已经不是新鲜的事物而且 Apache commons logging 也已经在使用这种思想了,但现在 SLF4J 正迅速成为 Java 世界的日志标准。

  • 在你的开源或内部类库中使用 SLF4J 会使得它独立于任何一个特定的日志实现,这意味着不需要管理多个日志配置或者多个日志类库。

  • SLF4J 提供了基于占位符的日志方法,不需要检查 isDebugEnabled (), isInfoEnabled () 等等,提高了代码可读性。

  • 通过使用 SLF4J 的日志方法,你可以延迟构建日志信息(Srting)的开销,直到你真正需要,这对于内存和 CPU 都是高效的。


5.CMS产生的浮动垃圾

初始标记:标记 GC Roots 能直接到的对象。速度很快但是仍存在 Stop The World 问题。
并发标记:进行 GC Roots Tracing 的过程,找出存活对象且用户线程可并发执行。
重新标记:为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。仍然存在 Stop The World 问题。
并发清除:对标记的对象进行清除回收。

重新标记(Remark) 的作用在于:
之前在并发标记时,因为是 GC 和用户程序是并发执行的,可能导致一部分已经标记为 从 GC Roots 不可达 的对象,因为用户程序的(并发)运行,又可达 了,Remark 的作用就是将这部分对象又标记为 可达对象。

至于 “浮动垃圾”,因为 CMS 在 并发标记 时是并发的,GC 线程和用户线程并发执行,这个过程当然可能会因为线程的交替执行而导致新产生的垃圾(即浮动垃圾)没有被标记到;而 重新标记 的作用只是修改之前 并发标记 所获得的不可达对象,所以是没有办法处理 “浮动垃圾” 的。


6.Java 有几种线程池?

Java 通过 Executors 提供四种线程池,分别为:

  • newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
  • newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  • newScheduledThreadPool 创建一个定长线程池,支持定时和周期性任务执行
  • newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。

7.触发 Full gc

  • 老年代空间不足
  • 持久代空间不足
  • 统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间。Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。例如程序第一次触发MinorGC后,有6MB的对象晋升到旧生代,那么当下一次Minor GC发生时,首先检查旧生代的剩余空间是否大于6MB,如果小于6MB,则执行Full GC。
  • CMS GC时出现promotion failed(担保:s1s2–old)和concurrent mode failure
    对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。

8.Java 导致 CPU 一直满的原因

  • Java 内存不够或溢出导致 GC overhead 问题,GC overhead 导致的 CPU 100% 问题; GC overhead limt exceed 检查是 Hotspot VM 1.6 定义的一个策略,通过统计 GC 时间来预测是否要 OOM 了,提前抛出异常,防止 OOM 发生。
  • 死循环问题。如常见的 HashMap 被多个线程并发使用导致的死循环;
  • 某些特费 CPU 的操作被长期执行。以前有个 case, 使用正则表达式去判断是不是符合某个规则,可是有些时候输入参数是一个几十 K 或更长的数据,该正则写又不好,导致 CPU 遇到这种输入,就爆掉了.

9.阻塞队列和同步队列

  • 阻塞队列是使用lock和unlock来实现加锁和释放的队列,如果没有显示释放当前线程的锁,该线程会一直阻塞在队列中。
  • 同步队列,即AQS。AQS 内部依赖一个 FIFO 双向队列来完成同步状态的管理,当前线程获取同步状态失败时,会将当前线程及等待信息构成成一个 Node 节点加入到同步队列中,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。同步队列会依次用首队列去获取同步状态,所以同步队列中的线程并没有阻塞,而是在排队等待执行。

10.关于 redis 哨兵判断监视节点是否宕机的原理

Redis 哨兵 Sdown,Odown:两种失败状态

  • sdown 是主观宕机,就一个哨兵如果自己觉得一个 master 宕机了,那么就是主观宕机

  • odown 是客观宕机,如果 quorum 数量的哨兵都觉得一个 master 宕机了,那么就是客观宕机

sdown 达成的条件很简单,如果一个哨兵 ping 一个 master,超过了 is-master-down-after-milliseconds 指定的毫秒数之后,就主观认为 master 宕机

sdown 到 odown 转换的条件很简单,如果一个哨兵在指定时间内,收到了 quorum 指定数量的其他哨兵也认为那个 master 是 sdown 了,那么就认为是 odown 了,客观认为 master 宕机

11.死锁避免

死锁避免的基本思想:系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配,这是一种保证系统不进入死锁状态的动态策略。

如果操作系统能保证所有进程在有限时间内得到需要的全部资源,则系统处于安全状态否则系统是不安全的。

  • 安全状态是指:如果系统存在 由所有的安全序列 {P1,P2,…Pn}, 则系统处于安全状态。一个进程序列是安全的,如果对其中每一个进程 Pi (i >=1 && i <= n) 他以后尚需要的资源不超过系统当前剩余资源量与所有进程 Pj (j < i) 当前占有资源量之和,系统处于安全状态则不会发生死锁。
  • 不安全状态:如果不存在任何一个安全序列,则系统处于不安全状态。

12.死锁预防

我们可以通过破坏死锁产生的 4 个必要条件来 预防死锁,由于资源互斥是资源使用的固有特性是无法改变的。

  • 破坏 “不可剥夺” 条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。
  • 破坏” 请求与保持条件 “:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。
  • 破坏 “循环等待” 条件:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一些常见的产品经理面试题及其参考答案: 1 你如何定义产品成功? 产品成功的通常基于以下几个方面: - 用户满意度:产品否满足用户需求并提供良好用户体验。 - 商业价值:产品有盈利能力或能够创造商业价值。 - 市场份额:产品在市场上的占有率和竞争力。 - 团队表现:产品团队的协作和执行能力。 2. 你如何确定产品的优先级? 确定产品的优先级通常需要考虑以下几个因素: - 用户需求:首先需要关注用户需求,并对需求进行优先级排序。 - 商业价值:对于商业价值显著的功能,应该考虑优先实现。 - 可行性:需要考虑技术可行性和团队的资源能力。 - 竞争情况:需要关注市场上其他产品的竞争情况。 3. 你如何进行产品规划? 产品规划通常需要包括以下几个步骤: - 定义产品标:明确产品的愿景、使命和标。 - 进行市场调研:了解市场需求和竞争情况。 - 制定产品计划:制定产品路线图和计划,包括功能开发和发布时间表。 - 确定产品需求:将市场需求转化为具体的产品需求。 - 评估资源:评估团队和技术资源的能力和可用性。 - 制定预算:制定产品开发和运营的预算。 4. 你如何进行产品设计? 产品设计通常需要包括以下几个步骤: - 确定用户需求:了解用户需求和使用场景。 - 制定产品策略:制定产品的定位、功能、体验和品牌策略。 - 进行原型设计:制定产品设计方案,并进行原型设计和测试。 - 进行用户测试:测试原型,获取用户反馈和意见。 - 优化和迭代:根据用户反馈和意见,优化和迭代产品设计。 5. 你如何进行产品推广? 产品推广通常需要包括以下几个步骤: - 制定推广策略:制定推广的标、受众、渠道和内容策略。 - 制定推广计划:制定推广时间表和预算。 - 进行推广活动:进行各类推广活动,包括广告、宣传、促销等。 - 进行数据分析:对推广效果进行数据分析和评估。 - 优化推广策略:根据数据分析和评估结果,优化和调整推广策略。 以上仅为参考答案,具体的答案需要根据具体情况进行调整和补充

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员世杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值