JVM内存区域
线程共享区:
1,堆:主要用来存放对象实例,也是GC管理的主要区域
2. 方法区:已加载类的信息,常量,静态量都存在这
线程私有区:
1. 虚拟机方法栈:生命周期与线程线程相同,里面由方法对应的栈帧构成,栈帧里面有局部变量,常量池引用,和对象引用
2. 本地方法栈:服务于Native方法,提供本地方法接口
3. 程序计数器:用来存放线程的下一个字节码指令,线程的恢复,跳转也依赖于他
JVM调优
1.JVM三大性能调优参数-Xss:规定每个线程虚拟机(堆栈)的大小-Xms:堆的初始值-Xmx:堆能达到的最大值。
2. GC调优的目的: 将转移到老年代的对象数量降低到最小 减少GC的执行时间GC优化是最后不得已才采用的手段
3. 调优:a. 查看堆空间大小分配(年轻代、年老代、持久代分配)
b. 垃圾回收监控:长时间监控回收情况
c. 线程信息监控:系统线程数量
d. 线程状态监控:各个线程都处在什么样的状态下
e. 线程详细信息:查看线程内部运行请况,死锁检查
f. CPU热点:检查系统哪些方法占用了大量的CPU时间
g. 内存热点,检查哪些对象在系统中数量最大
简要说明JAVA虚拟机的内存回收机制
传统的C/C++,需要程序员负责回收已经分配内存。
显式回收垃圾的缺点:
1、程序员忘记及时回收,从而导致内存泄漏,降低系统的性能
2、程序错误回收程序核心类库的内存,导致系统崩溃
Java语言不需要程序员直接控制内存回收,是由JRE在后台自动回收不再使用的内存,称为垃圾回收机制,简称GC
1、可以提高编程效率。
2、保护程序的完整性
3、其开销影响性能。Java虚拟机必须跟踪程序中有用的对象,确定哪些是无用的
垃圾回收机制的特点:
1、垃圾回收机制回收JVM堆内存里的对象空间,不负责栈内存数据
2、垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行
3、可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象
垃圾回收机制回收任何对象之前,总会先调用他的finalize方法,他是在Object类中定义的,因此所有的类都继承了他,子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。一般情况下这个方法由JVM调用,程序员不要去调用。
java虚拟机的概述(内存结构概述)
java虚拟机是一台执行java字节码的虚拟计算机,它拥有独立的运行机制其运行的java字节码也未必由java语言编译而成。
jvm平台的各种语言可以共享java虚拟机带来的跨平台性,优秀的垃圾回收器,以及可靠的即时编译器。
java技术的核心就是java虚拟机(JVM,java Virtual Machine)因为所有的java程序都运行在java虚拟机内部。
java虚拟机就是二进制字节码的运行环境。
特点
一次编译,到处运行
自动内存管理
自动垃圾回收功能
跨语言的平台
java虚拟机只关心字节码文件的是否符合规范,不限于java的字节码
java虚拟机是最强大的虚拟机,甚至比java语言本身地位还高
jvm的整体结构
jvm的执行流程:
其中存在两次编译,第一次是java代码编译成字节码文件,第二次是字节码文件编译成机器指令
1. java文件被编译器编译成class文件
2. class文件被类装载器加载到内存中的方法区
3. JVM执行引擎读取方法区的字节码进行执行(即:解析执行、编译执行或者两者兼有)
4. 输出执行结果
jvm的生命周期
虚拟机的启动:
java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class) 来完成的,这个类是由虚拟机的具体实现指定的
虚拟机的执行:
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。
程序开始执行时他才运行,程序结束时他就停止。
执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
虚拟机退出:
有以下几种情况:
程序正常执行结束
程序在执行过程中遇到了异常或错误而异常终止
由于操作系统出现错误而守致Java虚拟机进程终止某线程调用Runtime类或system类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况
双亲委派机制
概念:
Java虚拟机对class文件采用的是==按需加载==的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是==双亲委派模式==,I即把请求交由父类处理,它是一种任务委派模式。
工作原理:
1、如果一个类加载器收到了类加载请求求它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;
2、如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;
3、如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
优点:避免了类的重复加载 保护程序安全,防止核心API被恶意篡改