JAVA语言学习-Day13

参考教学视频:秦疆

JVM概述

JVM位置:操作系统之上

JVM的体系结构

.java -> Class File -> 类加载器 Class loader <--> 运行时数据区 Runtime Data Area <--> 本地方法接口 <- 本地方法库

运行时数据区 Runtime Data Area <--> 执行引擎

  • 方法区:Method Area

  • Java栈:Stack

  • 本地方法栈:Native Method Stack

  • 堆:Heap

  • 程序计数器:

  • 执行引擎:executeEngine

  • 本地方法接口:Native Method Interface

JVM调优,方法区,堆

类加载器

作用:加载class文件

  1. 虚拟机自带的加载器

  2. 启动类(根)加载器

  3. 扩展类加载器 ExtClassLoader

  4. 应用程序加载器 AppClassLoader

双亲委派机制:安全

//App -> Ext -> Boot(最终执行)

  1. 类加载器收到类加载的请求

  2. 将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器

  3. 启动加载器检测是否能够加载当前类,如果能就结束,使用当前类加载器,否则抛出异常,通知子类加载器进行加载

  4. 重复步骤3

沙箱安全机制

沙箱:限制程序运行的环境

native、方法区

//native:凡事带了native关键字,说明java的作用范围无法达到,调用了底层c语音库 //会进入本地方法栈,调用本地方法接口 JNI //JNI的作用:扩展Java的使用,融合不同的编程语言为java使用

程序 = 数据结构 + 算法

  1. 栈:数据结构,先进后出

  • 主管程序的运行,生命周期和线程同步;线程结束,占内存释放,对于栈来说,不存在垃圾回收问题

  • 8大基本数据类型+对象引用+实例方法

  1. 队列:先进先出

HotSpot和堆

三种JVM

  • Sun公司:HotSpot

  • BEA公司:JRockit

  • IBM:J9VM

堆(Heap)

一个JVM只有一个堆内存,堆内存的大小是可以调节的

类加载器读取的类文件后,一般会把类、方法、常量、变量~放入堆内存中,保存所有引用类型的真实对象;

堆内存中细分为三个区域:

经过研究,99%的对象都是临时对象

  • 新生区(伊甸园区)Young/New

    • 伊甸园:所有的对象都是在伊甸园区new出来,满了触发一次轻GC

    • 幸存者区(0,1):

  • 老年区 old

  • 永久区 Perm

    这个区域常驻内存的,用来存放JDK自身携带的class对象。Interface元数据,存储的是Java运行时的一些环境或类信息,这个区域不存在垃圾回收,关闭虚拟机就会释放这个区域的内存

    一个启动类,加载了大量的第三方jar包。Tomcat部署了太多的应用,大量动态生成的反射类。不断的被加载,直到内存满就会出现OOM

    • jdk1.6之前:永久代,常量池在方法区

    • jdk1.7:永久代,但是慢慢的退化了,去永久代,常量池在堆中

    • jdk1.8之后:无永久代,常量池在元空间

-Xms1024m -Xmx1024m -XX:+PrintGCDetails

Jprofilter工具分析OOM

  • 能够看到代码第几行出错:内存快照分析工具,MAT,Jprofiler

  • Debug,一行行分析代码

MAT,Profiler工具作用:

  • 分析Dump内存文件,快速定位内存泄露;

  • 获得堆中的数据

  • 获得大的对象

  • 。。。。

-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

GC

  • JVM的内存模型和分区

  • 堆里面的分区有哪些,说说他们的特点

    • Eden

    • From

    • to

    • old

  • GC的算法有哪些

    • 标记清除法

    • 标记整理

    • 复制算法

    • 引用计数器

  • 轻GC和重GC分别在什么时候发生

新生区轻,老年代重

posted @ 2024-04-16 18:40  孟秋廿六  阅读(15)  评论(0)    收藏  举报