Jason's Blog

thumbnail

最近在找Java方向的工作,发现自己有很多不会的,尤其是底层架构和基础知识,所以写一篇文章让自己能够随时随地复习Java面试。

ThredLocal(线程变量副本)

  • Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。
  • 采用空间换时间,它用线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本。
  • ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中与元素的键为线程对象,而值为对应线程的变量副本
  • ThreadLocal在Spring中发挥着巨大的作用,在管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都出现了它的身影
  • Spring中绝大部分Bean都可以声明为singleton作用域,采用ThreadLocal进行封装,因此有状态的Bean就能够以singleton的方式在多线程中正常工作了

Java内存模型

  • 程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”
  • Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。
  • 本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务
  • Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存
  • 方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码
  • 运行时常量池子:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或域的引用

你能不能谈谈,Java GC是什么时候,对什么东西,做了什么事情?

  • 新生代有一个Eden区和两个survivor区,首先将对象放入Eden区,如果空间不足就向其中的一个survivor区上放,如果仍然放不下就会引发一次发生在新生代的minor GC,将存活的对象放入另一个survivor区中,然后清空Eden和之前的那个survior区的内容。在某次GC过程中,如果发现仍然有放不下的对象,就将这些对象放入老年代内存里去
  • 大对象以及长期存活的对象直接进入老年区
  • 当每次执行minor GC的时候应该对要晋升到老年代的对象进行分析,如果这些马上要到老年区的老年对象的大小超过了老年区的剩余大小,那么执行一次Full GC以尽可能地获得老年区的空间

类加载器工作机制

  • 装载:将Java二进制代码导入jvm中,生成Class文件
  • 连接:a)校验:检查载入Class文件数组的正确性; b)准备:给类的静态静态变量分配存储

 评论

 无法加载Disqus评论系统,请确保您的网络能够正常访问。