Week9 学习总结

用户头像
wyzwlj
关注
发布于: 2020 年 08 月 02 日

一、JVM架构



二、Java程序运行的过程

1、总体执行流程

2、字节码文件

    1)字节码的作用

        a. 类似于在操作系统指令之上建立了一个中间层,一个与具体操作系统的无关的操作指令层

        b. 使Java语言能够跨 操作系统、跨平台运行

        c. "计算机领域的任何问题都可以通过增加一个中间层(虚拟层)来解决"

    2)字节码文件的编程过程

    3)字节码文件的格式

3、字节码文件的执行

    1)字节码文件的加载

        a. 双亲委派机制

        b. ClassLoader的加载过程:ApplicationClassLoader(加载classpath下的文件)->PlatformClassLoader(加载jre/lib/ext/*.jar等)->BootstrapClassLoader(加载jire/lib/rt.jar等)

        c. 自定义ClassLoader:隔离加载类、扩展加载源、字节码加密

    2) 字节码的执行

        a. 解释执行

        b. JIT--热点代码的编译执行(JVM参数)

4、字节码指令在JVM中的执行过程

    1)JVM内存区域的划分

        a. 程序计数器

        b. 方法区

        c. 栈区:虚拟机栈+本地方法栈

        d. 堆区

        e. 直接内存

    2)具体执行过程





5、JVM内存模型--JMM

    1)解决的问题:多线程场景下,线程访问共享变量的问题 

    2)volatile关键字

        a. 保证了多线程环境下,共享变量的可见性,但并不能解决并发行问题

        b. 禁止指令重排序

三、JVM垃圾回收

1、如何判断对象是否可回收

    1)引用计数器

    2)可达性分析算法

2、垃圾回收的方法

    1)三种回收方法

        a. 清除

        b. 压缩

        c. 复制

    2)分代回收

3、垃圾回收过程中内存空间的管理

4、垃圾回收的过程

    1)回收算法&垃圾回收器



四、JVM性能调优工具

1、JPS

1)查看所有Java进程的pid

2、JSTAT

1)监控Java程序的资源和性能,如Heap size、垃圾回收情况

3、JMAP

1)输出所有内存中的对象

2)在不同时间执行jmap,并对结果进行对比分析,可以看出GC回收对象的过程

4、JConsole

5、JV isualVM

五、Java代码优化

1、代码中需要注意的点

    1)合理使用多线程

        a. 启动线程数 = [任务执行时间 /(任务执行时间-IO等待时间)]*CPU核数 = 任务执行时间 / CPU执行时间 * CPU核数

    2)注意多线程竞争

    3)注意线程安全问题

        a. 局部变量: 线程安全

        b. 局部的对象引用:对象仅在方法内部,不会发生逃逸时,是线程安全的

        c. 成员对象:多线程同时访问是,线程不安全

    4)ThreadLocal

    5)内存泄漏问题

        a. 长生命周期对象引起的内存泄漏

        b. 静态容器引起的内存泄漏

        c. 缓存引起的内存泄漏

2、优化建议

    1)使用池化技术

    2)使用合适的数据结构

    3)缩短无用对象的生命周期

    4)合理的使用IO

    5)优先使用组合,而非继承

    6)合理使用单例模式

    7)使用“中间层”技术



用户头像

wyzwlj

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
Week9 学习总结