Java基础知识
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java基础知识,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9028字,纯文字阅读大概需要13分钟。
内容图文
![Java基础知识](/upload/InfoBanner/zyjiaocheng/813/15ec68d922bf4e9998a627dd37cf1311.jpg)
GC垃圾判断:
? ? ? ? ? ? 引用计数法 ? ? ? ? : ? ?循环引用问题 ? ? ? ? ? ? 可达性分析算法 ? : ??在“GC?roots”和一个对象之间没有可达路径,则称该对象是不可达的。不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。 ?垃圾回收算法:
标记清除算法:产生内存碎片化 复制算法: 浪费空间 标记整理算法 : 分代回收算法:不同生命周期采取不同算法, 新生代复制算法,老年代标记整理算法,分散回收,减少一次GC所有停顿的时间。 垃圾收集器: ? ? ? ? ? ? ? ??SerialGC:?串行GC,?单线程,?复制算法,?Client模式下默认新生代GC ? ? ? ? ? ??ParNew:?并行GC,?多线程,?复制算法,?Server模式下默认新生代GC?1.7默认 ? ? ? ? ? ??ParallelScavenge:?多线程,?复制算法,?具有自适应调节策略(优于ParNew)?1.8默认 ? ? ? ? ? ??Serial?Old:?SerialGC老年代版,?单线程,?标记整理算法 ? ? ? ? ? ??Parallel?Old:?ParallelScavenge老年代版,?多线程,?标记整理?1.8默认 ? ? ? ? ? ??CMS:?Concurrent?mark?sweep,?多线程,?标记清除,?执行过程:?初始标记(STW)->并发标记->重新标记(STW)->并发清除->线程重置 ? ? ? ? ? ??G1:?多线程,?标记整理算法,?划分内存几个独立区域收集,?优先回收垃圾最多的区域?1.9默认 ? ? ? ? ? ? ZGC:?jdk11提供,?着色指针和读屏障,?多层堆和压缩 ? ?MinorGC(复制->清空->互换) ? ? ? ? ? ?Eden区:?Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当Eden区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收。 ? ? ? ??首先,把Eden和ServivorFrom区域中存活的对象复制到ServicorTo区域(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果ServicorTo不够位置了就放到老年区); ? ? ? ??然后,清空Eden和ServicorFrom中的对象; ? ? ? ? ? 最后,ServicorTo和ServicorFrom互换,原ServicorTo成为下一次GC时的ServicorFrom区。 ? MajorGC 在进行MajorGC前一般都先进行了一次MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。当老年代不足时 ?OOM异常。 ?四种引用类型
? ? ? ? ? ? 强引用:把一个对象赋给一个引用变量。 ? ? ? ? ? ? 弱引用:要用SoftReference类来实现,当系统内存空间不足时它会被回收。软引用通常用在对内存敏感的程序中。 ? ? ? ? ? ? 虚引用:用WeakReference类来实现,垃圾回收机制运行就会被回收 ? ? ? ? ? ? 元引用:PhantomReference类来实现,必须和引用队列联合使用。虚引用的主要作用是跟踪对象被垃圾回收的状态。 ? 类加载机制 ? ? ? 双亲委派加载,收到加载请求,先委托父类加载,父类无法加载,子类再去尝试加载。保证了使用不同的类加载器最终得到的都是同样一个Object对象。? ?? ? ? ? ? ? 加载:将.class文件加载内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口 ? ? ? ? ? 验证:?文件格式验证,?元数据验证,?字节码验证,?符号引用验证 ? ? ? ? ? 准备:?静态变量在方法区分配内存,并设置默认初始值 ? ? ? ? ? 解析:?将常量池内的符号引用替换为直接引用的过程 ? ? ? ? ? 初始化:执行类构造器<client>方法的过程。<client>方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并的 ? ? ? ? ? 使用: ? ? ? ? ? 卸载: ? ??OOM原因及排查
? ? ? ? ? ?主要分为三种:? ? ? ? ? ? 1. OutOfMemoryError: PermGen space(Metaspace)设置大点
? ? ? ? ? ? 2. OutOfMemoryError: Java heap space ?
? ? ? ? ? ? 3. OutOfMemoryError:unable to create new native thread? 生成进程的内存镜像dump文件,例如: jconsole、jvisualvm、jmap?等JDK自带工具分析,分析日志中大内存对象原因。
Tomcat类加载机制
? ? ? ?Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给commonClassLoader走双亲委托。
? ? ? ? 每个容器可以部署多个应用,不同应用Jar依赖不一样,这样做可以保证每个应用程序类库独立不相互依赖。web容器支持JSP文件修改,每次修改不需要重启,每一个JSP文件对应一个Jsp类加载器。 ? ? ? ? ? ? HashMap ????数组+链表/红黑树,?链表长度大于8(且数组长度大于64)时,?链表树化(扩容时,?桶元素小于6,?树退化为链表) ????先通过hash值找到桶,?再遍历数据等值比较 ? ? 初始容量16,扩容因子0.75时,,?数组长度为2的倍数,?数据迁移 ????并发情况有Infinite?Loop 无限循环问题 ? ??transient 修饰的字段不会被序列化 ? ? HashTable ?初始化容量是11 ? ? hashMap?扩容大小为什么是2的幂:?(n?-?1)?&?hash算法,如果n不为2的幂次方,易产生空间浪费,(n?-?1)?&?hash?约等于??hash % n ,2进制运算远高于取模。? ?
Fork/Join框架
?Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join框架要完成两件事情:
1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割
2.执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里,启动一个线程从队列里取数据,然后合并这些数据。
在Java的Fork/Join框架中,使用两个类完成上述操作
1.ForkJoinTask:我们要使用Fork/Join框架,首先需要创建一个ForkJoin任务。该类提供了在任务中执行fork和join的机制。通常情况下我们不需要直接集成ForkJoinTask类,只需要继承它的子类,Fork/Join框架提供了两个子类:
a.RecursiveAction:用于没有返回结果的任务
b.RecursiveTask:用于有返回结果的任务
2.ForkJoinPool:ForkJoinTask需要通过ForkJoinPool来执行
任务分割出的子任务会添加到当前工作线程所维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列的尾部获取一个任务(工作窃取算法)。
Fork/Join框架的实现原理
ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成,ForkJoinTask数组负责将存放程序提交给ForkJoinPool,而ForkJoinWorkerThread负责执行这些任务。
? Java创建对象有哪几种? ? ? new、工厂模式、反射和克隆 ?
手写动态代理
https://www.jianshu.com/p/58759fef38b8 ? Jetty 与Tomcat的 区别 1.架构比较 jetty架构是基于Handler来实现的,主要的扩展功能都可以用Handler来实现,扩展简单 tomcat的框架是基于容量设计的,进行扩展是需要了解tomcat的整体设计结构,不易扩展 2.性能比较 jetty和tomcat性能方面差异不大 ? jetty可以同时处理大量链接而且可以长时间保持链接,适合于javaWeb聊天应用 jetty默认采用NIO结束来处理I/o请求上更占优势,在处理静态资源时,性能较高 ? tomcat适合处理少数非常繁忙的连接,也就是连接生命周期短的话,tomcat的总体性能更高 tomcat默认采用B/o处理I/o请求,在处理静态资源时,性能较差 ? ?重定向和请求转发的区别
1、重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向
2、重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址
3、转发是服务器行为,重定向是客户端行为。重定向时浏览器上的网址改变 ,转发是浏览器上的网址不变
4、重定向是两次request,转发只有一次请求
5、重定向时的网址可以是任何网址,转发的网址必须是本站点的网址
内容总结
以上是互联网集市为您收集整理的Java基础知识全部内容,希望文章能够帮你解决Java基础知识所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。