我爱编程编程基础

1. Java基础

2018-03-10  本文已影响0人  Allen同学

一、Java

1.1语言特性

1.1.1类继承

1.1.2泛型

1.1.3多线程

syni

volatie

TLAB:全程时Thread Local Allocation Buffer即线程本地分配缓存,是一个线程专用的内存分配区域,是为了加速对象分配而生的,每一个线程都会产生一个TLAB,该线程独享的工作区域,java虚拟机使用这种TLAB区来避免多线程冲突问题,提高了对象分配的效率。TLAB空间一般不会太大,当大对象无法在TLAB分配时,则会直接分配在内存上。

1.1.4反射

Class类
Class.forName("类的全称")

1.1.5序列化

1.1.6封装类

1.1.7引用

1.2类库

1.2.1集合

java中集合为value,key-value两种,存储的又分为List,Set,

  1. List是有序的,可重复的
  2. Set是无序的不可重复的,根据equals和hashcode判断,如果要用contain判断对象是否存在set中必须重写hashcode方法

存key-value为map

  1. ArrayList跟LinkedList的区别:ArrayList底层实现的是数组,LinkedList底层实现的是链表
  2. HashMap跟HashTable的区别:1.HashMap跟HashTable都可以用key-value存储数据,2.hashMap允许把null作为key或者value,HashTable不可以。3.HashMap是线程不安全的,效率高,HashTable是线程安全的,效率低。

1.2.2流

IO/NIO
IO类型

二、JVM

2.1. 类加载子系统

负责从文件系统中或者网络中加载Class信息,加载的信息存放在一块称为方法区的内存空间


双亲委派
OSGI

java对象生命周期

2.2. java堆

在Java虚拟机中启动的时候建立java堆,他是java程序最主要的内存工作区域,几乎所有的对象实例都存放在java堆中,java堆是所有线程共享的。


java堆是java应用程序关系最密切的内存空间,几乎所有对象都是存放在其中的,并且java堆完全是自动化管理的,通过垃圾回收机制,垃圾对象会自动清理,不需要显示地释放。
根据垃圾回收机制不同,java堆可能拥有不同的结构,最为常见的就是将整个java堆分为新生代和老年代。其中新生代存放着新生对象或者年龄不大的对象,老年代则存放老年对象。

新生代分为eden区、s0区、s1区,其中s0和s1区经常被称为from,to区,他们是两块大小相等,并且可以互换角色的空间。

绝大多数情况下,对象首先分配在eden区,在一次新生代回收之后,如果对象还活着,则进入s0 或者 s1区,之后每经过一次垃圾回收,如果对象还存活,则他的年龄就增加1,当对象达到一定年龄之后,则进入老年代。

2.3. java栈

每个虚拟线程都会有一个私有的栈,一个线程的java栈在线程创建的时候会被创建,java栈中保存着局部变量、方法参数,同时java方法的调用、返回值等。


Java栈是一块线程私有的内存空间,一个栈,一般由三个部分组成:局部变量表、操作数栈、帧数据区。

2.4. 方法区

就是存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等。


java方法区和堆一样,方法区是一块所有线程共享的内存区域,它保存系统的类信息,比如类的字段、方法、常量等。方法区的大小决定了系统可以保存多少类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出的错误,方法区可以理解为永久区(Perm java1.8已移除)

2.5. 垃圾回收器

是java的核心,java有一套自己进行垃圾清理的机制


JVM结构、GC工作机制详解,GC有两点:

2.4.1 垃圾回收算法
  1. 引用计数法:这是一个比较经典的垃圾回收算法,其核心是在对象被其他所引用时计数器加1,而当引用失效的时候减1,有个严重的问题:无法处理循环引用的情况,还有就是每次进行加减操作比较浪费系统性能。

  2. 标记清除法:分为标记和清除两个阶段进行处理内存中的对象,这个方法有个很大的弊端,就是空间碎片的问题,垃圾回收后,空间不是连续的,不连续的内存空间工作效率会低于连续的内存空间。

  3. 复制算法:其核心是将内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中存留的对象复制到未使用的内存块中,之后去清除之前正在使用的内存块中所有的对象,反复去交换两个内存角色,完成垃圾收集。(java新生代的from to 就是使用这个算法。)

  4. 压缩标记法:压缩标记法在标记清除法基础上做了优化,把存活的对象压缩到内存一端,而后进行垃圾清理(java老年代使用的就是这个算法)

  5. 分代算法:就是根据对象特点把内存分为N块,而后根据每个内存特点使用不同的算法,对于新生代老年代来讲,新生代回收频率很高,但是每次回收耗时很短,而老年代回收频率较低,但是耗时较长,所以应该尽量减少老年代的GC。(体现新生代老年代)

  6. 分区算法:将整个内存分为N个小的空间,每个小空间都可独立使用,这样细粒度的控制一次回收小空间,而不是对整个空间进行GC,从而提升性能,并减少GC停顿时间。(1.7以后新提出)

2.4.2 垃圾回收器

在java虚拟机中垃圾回收器不仅仅只有一种,什么情况下使用哪一种,对性能又有什么影响,都是我们应该了解的


1. 串行垃圾回收器(serial)

是指单线程进行垃圾回收的回收器,每次回收时,串行回收器只有一个工作线程,对于并行能力较弱的计算机来说,串行回收器的专注性和独占性拥有更好的性能表现。串行回收器可以在新生代和老年代使用,根据作用于不同的堆空间,分为新生代串行回收器和老年代串行回收器。

2. 并行垃圾回收器(ParNew)

在串行回收器的基础上进行了优化,他可以使用多个线程同时进行垃圾回收,对于性能较强的计算机而言,可以有效的缩短垃圾回收所需的实际时间。
ParNew回收器是一个工作在新生代的垃圾回收器,他只是简单的将串行回收器多线程化,回收策略和算法跟串行回收器一样。

新生代ParallerGC回收器,使用了复制算法的收集器:也是多线程独占形式的收集器,但ParallerGC有个非常重要的特点,就是它非常关注系统的吞吐量。(1.8默认)

老年代ParallerOldGC回收器也是一种多线程回收器,和新生代ParallerGC回收器一样,也是一种关注吞吐量的回收器,它是使用标记压缩算法进行实现。

3. CMS回收器

CMS全称是Concurrent Mark Sweep是并发标记清除,使用的是标记清除算法,主要关注系统停顿时间。
CMS并不是独占的回收器,也就是说CMS回收的时候,应用程序仍在不停工作,又会有新的垃圾产生。

4. G1回收器

G1回收器(Garbage-First)是在jdk1.7提出的垃圾回收器,长期目标来看是为了替代CMS回收器,G1回收器拥有独特的垃圾回收策略,G1回收器属于分代垃圾回收器,区分新生代和老年代,依然有eden和from/to区,并不要求整个eden区或者新生代、老年代空间都连续,它使用了分区算法。(1.9默认)

2.4.3 常见问题

垃圾回收时的停顿现象:
垃圾回收器的任务是识别和回收垃圾对象进行内存清理,为了让垃圾回收器可以搞笑的执行,大部分情况下,会要求系统进入一个停顿的状态,停顿的目的是终止所有的线程,这样系统才不会有新的垃圾产生,同时停顿保证了系统在某一瞬间的一致性,也有益于更好的标记垃圾对象,因此在垃圾回收时,都会产生应用程序的停顿。

2.6. 本地方法栈

基本与java栈一致,最大的区别是,本地方法用于本地方法调用,java虚拟机允许java直接调用本地方法,通常使用c语言编写


2.7.直接内存

Java的NIO库允许java程序使用直接内存,从而提高性能,通常直接内存速度会优于java堆,读写频繁的场合会考虑使用。


直接内存也是java程序中非常重要的组成部分,特别广泛应用在NIO中,直接内存跳过了Java堆,使java程序可以直接访问原生堆空间,因此在一定程度上加快了内存访问速度。

2.8.PC寄存器

PC寄存器是每个线程私有的空间,java虚拟机会为每个线程创建PC寄存器,在任意时刻,一个java线程总是在执行一个方法,这个方法被成为当前方法,如果当前方法不是本地方法,PC寄存器就会执行当前正在被执行的指令,如果是本地方法,则PC寄存器的值为undefined,寄存器存放当前执行环境指针,程序计数器,操作栈指针,计算变量指针等信息。


2.9.执行引擎

负责执行虚拟机的字节码,一般先编译成机器码,在执行。


三、目录

目录
下一篇:2. 设计模式与架构

上一篇 下一篇

猜你喜欢

热点阅读