文档章节

一篇文章带你领略——JVM运行原理揭秘

须臾之余
 须臾之余
发布于 08/18 10:32
字数 945
阅读 31
收藏 0

JVM运行时数据区

线程共享所有线程能访问这块内存数据,随虚拟机或GC而创建和销毁

线程独占每个线程都会有它独立的空间,随线程生命周期而创建和销毁

线程安全问题:共享资源的抢占、线程共享的内存区域

方法区

方法区作用:存储加载的类信息、常量、静态变量、JIT编译后的代码等数据

GC:方法区存在垃圾回收,但回收效率低;回收主要针对常量池的回收。和类型的卸载;当方法区无法满足内存需求时,报OOM。

方法区属于Java虚拟机协议,比如Hotsport虚拟机是对其具体实现,实现的时候会去实现方法区,堆内存,垃圾回收GC,永久代是对方法区的实现,新生代,老年代对堆内存实现,jdk1.8就变了,以元数据来实现方法区。

堆内存

作用:唯一的目的就是存放对象实例,几乎所有对象、数组都是在这里存放

对于大多数应用来说,堆是JVM管理的内存中最大的一块内存区域,也是最容易OOM的区域

大多数JVM都将堆实现为大小可扩展的(通过-Xmx、-Xms)控制

思考问题一:堆中存储了对象,那到底存储了什么?

Java对象在内存中的布局

思考问题二:对象何时被回收?

1、引用计数法(无法解决两个对象相互引用无法回收问题,导致内存泄露,JVM肯定不回去使用这种方式)

2、可达性分析算法

主流的商用程序语言(Java、C#)都是通过可达性分析算法来判定对象是否存活的,

GC Roots可以是:1、虚拟机栈;2、方法中静态属性引用对象;3、方法区中常量引用对象;4、Native方法引用对象。

虚拟机栈

虚拟机栈:线程中方法执行的模型,每个方法执行时,就会在虚拟机栈中创建一个栈帧,每个方法从调用到执行的过程,就对应栈帧在虚拟机栈中从入栈到出栈过程。

Java线程本质是:从逻辑上来理解,开启一个Java线程,new Thread(()->{线程执行的业务代码})

main->show()->show1()->shou2()这样的调用链路,先进后出,就是,也就是代表虚拟机栈方法调用逻辑

虚拟机栈中的元素在逻辑上代表方法,代表方法的栈元素就叫做栈帧。

局部变量表

动态链接

方法里的局部变量并不是一致存在,只有在方法调用的时候才会存在,只有在方法调用才会有方法入栈。

返回值地址

本地方法栈、直接内存

本地方法栈:和虚拟机栈功能类似,虚拟机栈是为虚拟机执行Java方法而准备,本地方法栈是为虚拟机使用Native本地方法而准备的。

直接内存:JVM之外的内存,开发人员自己分配内存

class文件结构

现在看下整个过程执行流程

切换上下文方式,程序计数器来跟踪。

 

© 著作权归作者所有

须臾之余
粉丝 125
博文 68
码字总数 178724
作品 0
吉安
程序员
私信 提问
《成神之路-高级篇》Java并发编程——锁

本文是《成神之路系列文章》的第一篇,主要是关于JVM的一些介绍。 持续更新中 数据库相关锁机制 数据库的锁机制 表级锁、行级锁、页级锁 共享锁、排他锁 乐观锁与悲观锁 乐观锁、悲观锁 乐观...

HollisChuang's Blog
2018/10/14
0
0
《成神之路-基础篇》JVM——垃圾回收(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收 ...

2018/05/05
0
0
JVM源码分析之perfData文件的创建

背景 看泉子的一篇文章:JVM源码分析之Jstat工具原理完全解读 - 你假笨 里提到了两个JVM参数,可以控制perfdata文件是否共享,引用泉子对这两个参数的解释: UsePerfData:如果关闭了UsePerf...

阿杜_javaadu
2018/08/29
0
0
ThreadLocal趣谈 —— 杨过和他的四个冤家

一个一个上 一日醒来,杨过发现小龙女离家出走,于是外出寻找,不料碰上了金轮法王、李莫愁、裘千尺、公孙止四个冤家。 “哼,四个打我一个,算什么英雄好汉,有本事的,一个一个上!” 按照...

SexyCode
2018/06/12
0
0
如果你想学习Java,那么就来看这篇文章

一、前言 我是从大二开始学习的Java,当时的目标是Java Web开发,当时并不想考研,所以当时的学习是以就业为主,现在我大三了,学习Java Web开发已经一年了,因为种种原因,决定要考研,所以...

Jivanmoon
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:ElasticSearch查询

环境:ES2.3.2 地址:xxx:9200 注意动词使用:GET,POST,PUT,DELETE ElasticSearch PK Mysql 我的告警页面,查询条件会status='OK',isalarm=1,时间范围在:2019-03-01 13:45:41 到 2019......

浮躁的码农
19分钟前
3
0
简单的Cloud Toolkit教程,助你秒部署应用程序

1.什么是Cloud Toolkit Cloud Toolkit 是开发者本地 IDE 中的一款插件,可以帮助开发者更高效地开发、测试、诊断并部署应用。通过这个插件,可以==将本地应用一键部署到任意服务器==,甚至部...

small-bug
23分钟前
8
0
Linux系统产生随机数方法

系统环境变量($RANDOM) 范围:0~32767 加密:md5sum 加盐:stu echo $RANDOM echo $RANDOM |md5sum echo "stu$RANDOM" |md5sum |cut -c 8-15 openssl openssl rand -base64 8 时间......

Mustbecool
27分钟前
3
0
【2019年8月】OCP 071认证考试最新版本的考试原题-第14题

Choose two. Examine this SQL statement: UPDATE orders o SET customer_name = (SELECT cust_last_name FROM customers WHERE customer_id=o.customer_id); Which two are true? A) The su......

oschina_5359
35分钟前
2
0
功能测试与非功能测试

根据一份报告,应用程序崩溃导致71%的卸载。迫使用户卸载应用程序的其他原因是页面响应时间,混乱的UI,电池消耗等。这表明功能测试和非功能测试对于交付用户友好型应用程序的重要性。因此,...

八音弦
35分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部