深入理解java虚拟机
文章平均质量分 79
鲸鱼-D
这个作者很懒,什么都没留下…
展开
-
java类加载器
三种类加载器+双亲委派机制:实现java类的正确加载package com.jing.reflection;public class Test07 { public static void main(String[] args) throws ClassNotFoundException { // 1. 系统类加载器AppClassLoader ClassLoader systemClassLoader = ClassLoader.getSyste.原创 2021-11-15 22:46:49 · 606 阅读 · 0 评论 -
静态代码块和静态变量的初始化(<clinit>()方法执行)
类加载过程 类加载过程中的“类加载”是一个整体的词,主要包括以下三个阶段:加载:通过类加载器经Class文件加载进内存,提取出类的元数据存储在方法区当中,在堆当中生成Class对象。 连接:将Java类的二进制代码合并到JVM的运行状态之中的过程。 验证:确保类的信息符合JVM规范,没有危害安全的问题 准备:为静态变量分配内存,并初始化默认值(方法区) 解析:将虚拟机常量池中符号引用转为直接引用 初始化:执行类构造器<clinit>()方法。 类构造器方...原创 2021-11-15 21:19:51 · 1389 阅读 · 0 评论 -
Class对象存储在Java堆中
在JDK1.8完全废除永久代之前的JDK版本中,方法区是一个逻辑分区,实际是java堆的一部分,但是有Non-heap的标记,以便区分。 众所周知, java中new处的对象存放在java堆中,而对象的引用存放在虚拟机栈中。 Java中的Class也是一个类,所以Class对象也存放在堆当中,存放在方法区当中的是Class对象的引用...原创 2021-11-15 18:02:34 · 6898 阅读 · 6 评论 -
虚拟机执行子系统
书中该部分内容主要介绍Java程序是如何存储的、如何载入的、以及如何执行的这三个问题。本文章按照这个顺序简单记载一些重要的内容。类文件结构类文件(Class文件)是Java虚拟机执行引擎的数据入口。本章主要介绍的是Class文件结构中各个组成部分、以及每部分的定义、数据结构和使用方法。Class文件也称字节码文件,由源代码经编译器编译获得。存放的都是编译期间可以确定的数据。 字节:1Byte=8bit。Class文件是由一系列类似于 3A C8...(十六进制)...原创 2021-11-03 12:17:53 · 230 阅读 · 0 评论 -
垃圾收集器与内存分配策略
概述Java内存区域可以分为两类:一类是线程独享的区域,包括虚拟机栈、本地方法栈和程序计数器。这类内存随线程而生,随线程而死。内存的分配在编译器就看可确定,内存的回收随着线程结束而自然释放。无需额外的垃圾收集器干涉。 另一类是线程共享的区域,即Java堆和方法区。分配和回收都是动态,在运行期间才知道要创建哪些对象,在运行期间才会触发GC。所以,内存分配和垃圾收集针对的是Java堆这部分内存。垃圾收集垃圾收集要做的事情可以简单总结为两个步骤:确定哪些内存需要...原创 2021-10-27 10:38:07 · 106 阅读 · 0 评论 -
Java运行时常量池
概述 1.常量池在内存中的位置: 在JDK1.6中,方法区是以永久代的方式实现(HotSpot),常量池是方法区的一部分。 在JDK1.7中,方法区合并到堆内存中,常量池可以说在堆内存中。 在JDK8中,方法区又被剥离出来,只不过实现方式不是永久代,此时的方法区叫元数据区,常量池也就在元数据区。 2. 常量池的概念以及作用通常来讲,所有变量,包括基本类型和引用类型,他们都存在虚拟机栈中,包括变量类型、变量名称、和变量值。对于基本类型来说,值就是具...原创 2021-10-23 22:17:21 · 6037 阅读 · 0 评论 -
实战:OutOfMemoryError异常之 虚拟机栈和本地方法栈溢出
虚拟机参数虚拟机栈:-Xss128k,表示虚拟机栈最大内存为128k。 本地方法栈:-Xoss128k,表示本地方法栈最大内存为128k。由于在HotSpot虚拟机中不区分虚拟机栈和本地方法栈,所以栈容量只由-Xss参数设定。Java虚拟机规范中描述的两种异常如果线程请求栈深度大于虚拟机所允许最大深度(没有内存供继续分配),将抛出StackOverflowError异常。 如果虚拟机在扩展栈时无法申请到足够内存,将抛出OutOfMemoryError异常。单线程SOF测试...原创 2021-10-23 16:16:35 · 400 阅读 · 0 评论 -
实战:OutOfMemoryError异常之 Java堆溢出
Java堆用于存储对象实例,只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清楚这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。代码清单public class HeapOOM { static class OOMObject{ } public static void main(String[] args) { List<OOMObject> list = new Array...原创 2021-10-23 11:11:16 · 543 阅读 · 0 评论 -
Java程序的执行方式
1. java程序的执行方式:编译+解释 混合,在编译基础上进行解释运行的语言。编译:将源代码一次性转换成目标代码的过程。编译器:.java→.class 编译只执行一次,转换成的目标代码影响运行速度,所以编译器一般都集成很多优化技术,使生成的目标代码具备更好的执行效率。 解释:将源代码逐条转换成目标代码并逐条运行的过程。解释器。python是解释执行2. 高级语言分为静态语言和脚本语言静态语言:使用编译执行的编程语言,有了目标语言之后,不再需要编译器和源代码就可执行。 脚本语言:使用原创 2021-10-22 10:00:08 · 3223 阅读 · 0 评论 -
Java程序运行时数据区域
概述 java程序员虽然把内存控制的权利全权交给Java虚拟机,但是,当出现内存泄漏和溢出方面的问题时,如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一项异常艰难的任务。 java程序运行时的数据区域(java虚拟机管理的内存)分为多个线程共享内存和线程私有内存。所有线程共享的数据区域:依赖虚拟机进程的启动和结束而建立和销毁。细分为:堆和方法区(Java 8之后是元空间)。 线程私有的数据区域:依赖用户线程的启动和结束而建立和销毁。细分为:虚拟机栈、本地方法...原创 2021-10-22 21:13:19 · 146 阅读 · 0 评论