Java学习路线之 Java 虚拟机(四)

目录

一、内存管理

      1.1 对象的内存布局?Java 虚拟机组成部分,哪些是线程私有?

      1.2 如何判断对象是否存活?

      1.3 对象的四个引用

      1.4 垃圾收集算法有哪几个?

      1.4 G1垃圾收集器和GC日志

      1.5 虚拟机性能监控和可视化工具

二、虚拟机执行子系统

       2.1 class 无关性基石

       2.2 类加载器

       2.3 双亲委派是什么?有哪些?为什么要双亲委派?

       2.4 new 对象的创建过程?

三、Java 内存模型

       3.1 什么是 Java 内存模型,以及Java内存模型的作用?

       3.2 Happen Before 原则

       3.3 线程安全

       3.4 锁优化(未详细介绍)


一、内存管理

      1.1 对象的内存布局?Java 虚拟机组成部分,哪些是线程私有?

             线程私有的程序计数器、虚拟机栈、本地方法栈,线程共享的堆和方法区。

             1、程序计数器:指向当前运行的程序;

             2、虚拟机栈:存放局部变量表、方法栈帧等;

             3、本地方法栈:存放本地方法;

             4、堆:用于存放对象的实例;

             5、方法区:虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等;(运行时常量池:存放编译器生成的字面量和符号引用)。

 

      1.2 如何判断对象是否存活?

              1、引用计数法:每个对象拥有一个引用计数器,当对象被引用的时候,计数器+1,引用释放,计数器-1,存在循环引用的风险;

              2、可达性分析算法:以 GC Roots 为起始点,向下进行搜索,搜索走过的路径称为引用链,当该对象不存在到达 GC Roots 时,表示该对象可以被回收。

 

      1.3 对象的四个引用

              1、强引用:new 指令生成的对象,引用存在,不会被垃圾收集器回收。

              2、软引用:有用但非必需的对象,在内存溢出之前进行回收。

              3、弱引用:非必需的对象,只能生存到下一次垃圾回收之前。

              4、虚引用:该对象在垃圾回收的时候收到一个系统通知。

 

      1.4 垃圾收集算法有哪几个?

              1、标记清除算法;

              2、复制算法;

              3、标记整理算法;

              4、分代回收算法:新生代内存分为:Eden、Survivor_from、Survivor_to,老年代为:Old;

              新对象在 Eden 分配内存,对象有年龄,每次Eden区内存不够,执行一次新生代GC,对象的年龄增加一岁;新生代GC发生时,JVM会将 Eden 和 Survivor_from 两块内存中存活的对象,复制到 Survivor_to 内存中,然后将 Eden 和 Survivor_from 内存清空。

             年龄达到16的送入老年代和大对象会直接进入老年代。

 

      1.4 G1垃圾收集器和GC日志

img

收集器新/老年代算法目标适用场景
Serial新生代复制算法响应速度优先 
Serial Old老年代标记-整理响应速度优先 
ParNew新生代复制算法响应速度优先 
Parallel Scavenge新生代复制算法吞吐量优先 
Parallel Old老年代标记-整理吞吐量优先 
CMS老年代标记-清除响应速度优先 
G1both标记-整理+复制算法响应速度优先 

      1.5 虚拟机性能监控和可视化工具

名称作用
jpsJVM Process Status Tool,显示系统中所有的Hotspot虚拟机进程
jstatJVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据
jinfoConfiguration info for java,显示虚拟机配置信息
jmapMemory Map for java,生成虚拟机的内存转储快照(heapdump文件)
jhatJVM Heapdump Browser,用于分析heapdump文件,会建立一个HTTP/HTML服务器,用户可以在浏览器上查看分析结果
jstackStack Trace for java,显示虚拟机的线程快照
JConsoleJconsole是JDK自带的监控工具,用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,提供强大的可视化界面。
VisualVMVisualVM是一个集成多个JDK命令行工具的可视化工具。可以作为Java应用程序性能分析和运行监控的工具。开发人员可以利用它来监控、分析线程信息,浏览内存堆数据。

二、虚拟机执行子系统

       2.1 class 无关性基石

       2.2 类加载器

               类加载机制:将后缀为.class文件加载到内存,经过加载、链接、初始化生成二进制可执行文件。

               加载:将字节码读取到JVM中,并映射为JVM认可的数据结构。

               链接:1)验证:检验是否符合JVM虚拟机规范;

                         2)准备:初始化静态变量为零值;

                         3)解析:将间接引用替换为直接引用。

               初始化:执行类中定义的Java程序代码, 静态变量初始化。

 

       2.3 双亲委派是什么?有哪些?为什么要双亲委派?

         |-  类加载器收到类加载请求的时候,将请求委派给交给父类加载器进行加载,所有的加载请求都会委派给顶层的系统类加载器,当父类加载器无法加载时,子加载器再尝试加载。

         |-  启动类加载器、扩展类加载器、应用程序类加载器、自定义加载器;

         |-  为了系统安全,对于任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性。

 

       2.4 new 对象的创建过程?

             1、常量池中查找是否存在;

             2、类加载(初始化静态变量为零值,并初始化);

             3、内存分配;

             4、初始化非静态变量为零值;

             5、设置对象头;

             6、执行非静态变量的Java程序代码,即初始化。

 

三、Java 内存模型

       3.1 什么是 Java 内存模型,以及Java内存模型的作用?

          Java 内存模型定义各个变量的访问规则,由 violate、final、sychronized 关键字实现原子性、可见性、有序性,以及 happen before 原则组成,happen before 原则:程序顺序规则、管程规则、violate规则、线程start()规则、线程join()规则、传递性规则。

 

       3.2 Happen Before 原则

              1、程序顺序规则:

              2、管程规则:

              3、violate规则:

             4、线程start()规则:

             5、线程join()规则:

             6、传递性规则:

 

       3.3 线程安全

              1、互斥同步(悲观锁):

              2、非阻塞同步(乐观锁):

 

       3.4 锁优化(未详细介绍)

              1、自旋锁:

              2、轻量级锁:

              3、所偏向:

              4、锁消除:

              5、锁粗化:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值