![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
小白不想当码农
这个作者很懒,什么都没留下…
展开
-
一文带你刨析class文件,反正学医的老同学是听懂了
一文带你认识class文件Write Once , Run AnyWherejava如何实现跨平台?为啥C程序不能跨平台?hello.cpp#include<stdio.h>int main(){ printf("Hello World\n"); return 0; } 下面是这个c程序的执行过程预处理会将hello.cpp文件中通过include引入的头文件插入到程序文本中,得到hello.i文件编译器将hello.i中的C代码翻译成汇编指令,得到文件hel原创 2020-10-04 14:24:28 · 253 阅读 · 0 评论 -
JVM运行时数据区域之最终章
JVM运行时数据区域之最终章JVM运行时数据区域之java虚拟机栈JVM运行时数据区域之程序计数器堆什么是堆堆是java运行时数据区域中最大的一块内存,与栈不同,堆是被所有线程所共享的数据区域;在java中几乎所有的对象都在堆上面分配内存,即大多数对象都存放在堆中,注意这里说的“大多数”,下面会提及为何是大多数。GC堆?堆也被称之为是GC堆,因为堆是java垃圾回收器管理的内存区域,因为有垃圾回收器所以java程序员才不用向C和C++程序员那样管理释放内存。也正是因为垃圾回收,所以堆原创 2020-09-27 00:06:29 · 248 阅读 · 0 评论 -
JVM系列之java虚拟机栈
JVM系列之java虚拟机栈tip:上面讲了JVM运行时数据区域的程序计数器器(PC),这篇文章带大家走进JVM的运行时数据区域JAVA虚拟机栈啥是java虚拟机栈 java虚拟机栈和程序计数器一样也是线程私有的,生命周期和线程相同;它是Java方法执行的线程内存模型。当一个方法被执行的时候,java会同步创建一个栈帧,这里的栈帧就是栈的元素;每一个栈帧包含局部变量表,操作数栈,动态连接,方法返回地址等信息,一个方法从开始到执行结束对应着虚拟机栈中一个栈帧的入栈和出栈。下面放一张图让大家直观的理原创 2020-09-16 21:29:53 · 124 阅读 · 0 评论 -
JVM热身之程序计数器
JVM运行时数据区域之程序计数器Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来-----------《深入理解java虚拟机》在用C编程的时候,我们malloc一块空间总是需要手动进行free,不然就会造成内存泄露即使用过的内存没被释放,造成内存不够用了;而在Java中,垃圾回收器会自动帮我们回收在后台回收那些不再“使用”的内存,所以在Java编程中不容易出现内存泄露和溢出的问题。但是一旦出现例如java.lang.OutOfMemoryE原创 2020-09-14 11:12:18 · 182 阅读 · 0 评论 -
类加载概述
加载加载过程主要完成以下几件事情类加载器根据类的全限定名获取类的二进制字节流将二进制字节流表示的静态结构转换为方法区的运行时数据结构在堆上面实例化一个该类的Class对象,作为方法区这个类的各种数据访问的入口验证阶段验证是连接阶段的第一步验证阶段主要目的是确保Class文件的字节流中包含的信息符合java虚拟机规范,确保这些信息被加载入内存不会危害到jvm自身的安全。主要包含以下几个步骤文件格式验证 验证字节流是否符合Claa文件格式的规范要求,确保字节流所表示的静态结构能原创 2020-08-08 11:30:52 · 117 阅读 · 0 评论 -
HotSpot到底是咋有那么多对象的
本文参照与《深入理解jvm》首先介绍一下,HotSpot中对象的内存布局对象头:包括Mark Word 和 类型指针俩部分,markword是肯定有的,而类型指针是否存在依赖于引用的实现方式MarkWord里面存储着对象运行时候的数据,例如分代年龄,哈希值,偏向锁ID等MarkWord在32位和64位机器中分别占用32比特和64比特,他会根据对象的状态对空间进行复用,尽量在最小的空间中存储最多的数据实例数据存放对象的实例数据,是对象存储的真正有效的信息。实例数据包括类中的实例变原创 2020-07-27 18:21:07 · 114 阅读 · 0 评论 -
自动装箱的陷阱
今天在阅读 jvm关于自动装箱部分的内容时,对最后一个案例 自动装箱的的陷阱感到疑惑。解决后特此记录 Integer a=1; Integer b=1; Integer c=128; Integer d=128; Integer e=127; System.out.println(a==b); System.out.println(c==d); System.out.println原创 2020-07-13 18:43:43 · 230 阅读 · 0 评论 -
谈一谈 JIT
前言今天在看 《深入理解JVM》的时候,有这样一段内容执行引擎在执行字节码指令的时候,通常会有解释执行和编译执行俩种选择,也可能俩者兼备。对解释执行和编译执行的理解感觉欠缺所以记录下了如下内容编译执行与解释执行编译执行源代码 编译成 本地机器码,然后执行。典型的 C 和 C++ 程序采取这样的方式执行。优点但是运行时,由于直接执行本地机器码所以执行很快。缺点编译执行在编译的过程比较慢,大型的 C和 C++程序 编译时会非常慢。而且基于寄存器架构,可移植性很差解释执行在每条代码执行原创 2020-07-06 18:37:30 · 312 阅读 · 0 评论 -
java class文件结构脑图简介
原创 2020-05-21 11:28:02 · 171 阅读 · 0 评论 -
堆的分代
分代收集理论分代收集理论是多个收集器的设计原则,它的具体内容是弱分代假说:大多数对象朝生夕灭,弹指一挥间,人生短暂强分代假说:熬过GC次数愈多的对象,在GC的过程中越难被消亡跨代引用假说:存在跨代引用的对象是非常少数的 如果新生代的对象被老年代所引用,而jvm要进行 minorGC, 这时就不得不在固定的GCroot之外,再遍历所有的老年代对象来保障 ,这样会大大的降低GC的效率。所以可以在新生代中使用 RememberSet来 存储老年代中存在跨代引用的内存,在mino原创 2020-05-19 11:05:29 · 182 阅读 · 0 评论