Open rooobot opened 4 years ago
以下是第九周的内容大纲:
JVM组成架构:JVM屏蔽了底层系统的差异,为Java字节码文件构造了一个统一的运行环境
JVM
Java
class
Java字节码文件
堆和栈
方法区和程序计数器
main
Java线程栈:所有在方法内定义的基本类型变量,都会被每个运行这个方法的线程放入自己的栈中,线程的栈彼此隔离,所以这些变量一定是线程安全的。
线程工作内存和volatile
volatile
Java运行环境
JVM的垃圾回收
GC Roots
JVM分代垃圾回收
Eden
Survivor
from
to
JVM垃圾回收器算法
G1
G1垃圾回收内存管理机制:将堆内存划分为若干个区域,每个区域都可作用Eden区、Survivor区或老年代中的一个
JVM性能诊断工具
JPS
pid
JSTAT
Heap size
JMAP
VM
heap
JConsole
JVisualVM
Java代码优化
I/O
CPU
java.util.concurrent
IO
ThreadLocal
Java内存泄漏:如果程序保留对永远不再使用的对象的引用,这些对象将会占用并耗尽内存
JDK
LinkList
ArrayList
HashMap
concurrent
I/O buffer
NIO
hash
另外就是秒杀的案例分析,以及宅米网的性能优先实践分享。
以上是本周课程的主要内容。
本周的课程涉及到了Java底层的一些知识,比如JVM、垃圾回收、问题诊断、代码性能优化等等。对于JVM,因为大多数情况下,我们在线上配置好虚拟机的参数之后,很少再去调整。有时候出现问题的就需要使用一些相关的工具来定位问题,比如jstat、jmap等等,可能还要结合其它的一些工具来对问题进一步的分析和定位,最后再修复并重新发布。
jstat
jmap
在现在的微服务架构之下,把监控系统和全链路追踪系统做到位之后,线上的绝大多数问题都是可以及时发现的。再配合统一的日志服务,定位问题比以前要方便太多。
对于秒杀的案例,其实本质上体现的还是分与合的思想,动态和静态的内容分离,用户请求分层过滤,资源文件的请求合并,单独域名与原有域名和分离等等。
对于这一类高并发的服务,需要把整个流程中的每个环节进行细分,对每一步分别考虑优化,同时还要做好服务的降级,保证核心功能的高可用性。比如,对请求的内容进行压缩来减少请求时网络传输的数据量,使用多级缓存来快速响应每个环节,将业务流程进行精简优化等等。
其实,作为架构师,必然要去解决各种问题,每个问题都会对应着各自的需求,所以分析出问题的本质非常的重要,有时候我们很容易被一些信息所干扰,让我们对问题的理解产生偏差。
还有一点就是,通常我们并不缺解决问题的能力,缺的是解决问题的思路。
以下是第九周的内容大纲:
JVM
组成架构:JVM
屏蔽了底层系统的差异,为Java
字节码文件构造了一个统一的运行环境class
文件Java
栈Java
字节码文件Java
字节码文件编译过程堆和栈
JVM
实例对应唯一一个堆,应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并被应用中所有的线程共享。JVM
为每个新创建的线程都分配一个堆栈。方法区和程序计数器
JVM
进入启动类的main
方法时,就会为应用程序创建一个主线程,main
方法里的代码就会被这个主线程执行,每个线程有自己的Java
栈,栈里存放着方法运行期的局部变量,而当前线程执行到哪一行字节码指令,这个信息则被存放在程序计数寄存器。Java
线程栈:所有在方法内定义的基本类型变量,都会被每个运行这个方法的线程放入自己的栈中,线程的栈彼此隔离,所以这些变量一定是线程安全的。线程工作内存和
volatile
Java
内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行volatile
:一个共享变量(类的成员变量、类的静态成员变量)被volatile
修饰之后,那么就具备了两层语义Java
运行环境Java
编译环境:将Java
源文件编译为Java
字节码文件Java
平台运行环境:JVM
的垃圾回收JVM
垃圾回收就是将JVM
堆中已经不再被使用的对象清理掉,释放内存资源JVM
通过一种可达性分析算法进行垃圾对象的识别,并标记到GC Roots
列表中,没有被标记的对象就是可回收的垃圾对象JVM
分代垃圾回收Eden
区Survivor
区from
区to
区JVM
垃圾回收器算法G1
回收器G1
垃圾回收内存管理机制:将堆内存划分为若干个区域,每个区域都可作用Eden
区、Survivor
区或老年代中的一个JVM
性能诊断工具JPS
:查看主机上运行的所有Java
进程的pid
JSTAT
:对Java
应用程序的资源和性能进行实时的命令行监控,包括了对Heap size
和垃圾回收状况的监控JMAP
:可以输出所有内存中对象的工具,甚至可以将VM
中的heap
,以二进制输出成文本JConsole
、JVisualVM
Java
代码优化I/O
阻塞、多CPU
并发java.util.concurrent
IO
等待时间)] *CPU
内核数Java
线程安全:允许被多个线程安全执行的代码称作线程安全的代码ThreadLocal
Java
内存泄漏:如果程序保留对永远不再使用的对象的引用,这些对象将会占用并耗尽内存JDK
容器类LinkList
和ArrayList
的区别及适用场景HashMap
的算法实现及应用场景concurrent
包I/O buffer
及NIO
IO
通信hash
算法的虚拟化实现另外就是秒杀的案例分析,以及宅米网的性能优先实践分享。
以上是本周课程的主要内容。
本周的课程涉及到了
Java
底层的一些知识,比如JVM
、垃圾回收、问题诊断、代码性能优化等等。对于JVM
,因为大多数情况下,我们在线上配置好虚拟机的参数之后,很少再去调整。有时候出现问题的就需要使用一些相关的工具来定位问题,比如jstat
、jmap
等等,可能还要结合其它的一些工具来对问题进一步的分析和定位,最后再修复并重新发布。在现在的微服务架构之下,把监控系统和全链路追踪系统做到位之后,线上的绝大多数问题都是可以及时发现的。再配合统一的日志服务,定位问题比以前要方便太多。
对于秒杀的案例,其实本质上体现的还是分与合的思想,动态和静态的内容分离,用户请求分层过滤,资源文件的请求合并,单独域名与原有域名和分离等等。
对于这一类高并发的服务,需要把整个流程中的每个环节进行细分,对每一步分别考虑优化,同时还要做好服务的降级,保证核心功能的高可用性。比如,对请求的内容进行压缩来减少请求时网络传输的数据量,使用多级缓存来快速响应每个环节,将业务流程进行精简优化等等。
其实,作为架构师,必然要去解决各种问题,每个问题都会对应着各自的需求,所以分析出问题的本质非常的重要,有时候我们很容易被一些信息所干扰,让我们对问题的理解产生偏差。
还有一点就是,通常我们并不缺解决问题的能力,缺的是解决问题的思路。