写点什么

Week9- 课后总结 & 课后作业 JVM 垃圾回收机制

用户头像
Geek_165f3d
关注
发布于: 2020 年 08 月 05 日

1.JVM组成架构

java是一种跨平台的语言,JVM屏蔽了底层系统的不同,为java字节码构造了一个统一的运行环境。



2.java字节码文件

java所有的指令有200个左右,一个字节可以存储256种不同的指令信息,一个这样的字节称为字节码,在代码的执行过程 中,JVM将字节码解释执行,屏蔽对底层操作系统的依赖,JVM也可以交字节码编译执行,如果是热点代码,会通过JIT动态地编译为机器码,提高执行效率。



3.类加载器的双亲委托模型

低层次的当前类加载器,不能覆盖更高层次类加载器已经加载的类。如果低层次的类加载器想加载一个未知类,需要上级类加载器确认,只有当上级类加载器没有加载过这个类,也允许加载的时候,才让当前类加载器加载这个未知类。



4.堆&栈

堆:每个JVM实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享

栈:JVM为每个新创建的线程都分配一个堆栈。也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。

Java中所有的对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地主都分配内存,在堆中分配 的内存实际建立这个对象,而在栈中分配的内存中介一个指向这个堆对象的引用而已。

5.方法区 & 程序计数器



6.java(线程)栈

所有在方法内定义的基本类型变量,都会被每个运行这个方法的线程放入自己的栈中,线程的栈彼此隔离,所以这些变量一定是线程安全的。

7.JVM的垃圾回收

JVM垃圾回收就是将JVM堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。



JVM通过一种可达性分析算法时行垃圾对象的识别,具体过程是:从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。



进行完标记以后,JVM就会对垃圾对象占用的内存进行回收,回收主要有三种方法:

  • 清理:将垃圾对象占据的内存清理掉,其实JVM并不会真的将这些垃圾内存进行清理,而是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里,当应用程序需要创建新对象的时候,就从空闲列表中找一段空闲内存分配给这个新对象。

  • 压缩:从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么其余的空间就是连续的空闲空间。

  • 复制:将城堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标记过的可用对象复制到另一个空间中。

如下图所示:三种方法



8.JVM性能诊断工具

基本工具:JPS,JSTAT,JMAP,JSTACK

集成工具:JConsole,JVisualVM



9.java代码优化

合理并谨慎使用多线程

启动线程数 = 【任务执行时间/(任务执行时间 - IO等待时间)】*CPU核数



10 java线程安全

充许被多个线程安全执行的代码称作线程安全代码。

  • 方法局部变量

  • 方法局部的对象引用

  • 对象成员变量



11.ThreadLocal

  • ThreadLocal很多地方叫线程本地变量,或者叫线程本地存储。ThreadLocal为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突,实现线程间的数据隔离。

  • threadLocal只是实现了变量在不同线程中的数据隔离,即保证了同一变量在不同的线程中传递时可以有不同的值,换句话说ThreadLocal构建的是在同一线程中的全局变量,并没有解决共享变量的问题,在多线程并发访问共享变量时依然会出现并发问题



12 .java内存泄露



用户头像

Geek_165f3d

关注

还未添加个人签名 2019.12.14 加入

还未添加个人简介

评论

发布
暂无评论
Week9-课后总结  & 课后作业 JVM垃圾回收机制