文档章节

Java虚拟机结构学习

laohng1995
 laohng1995
发布于 2017/02/26 16:15
字数 1365
阅读 9
收藏 0

1.数据类型:原始数据类型和引用数据类型

     1.1原始数据类型和值:

            Java虚拟机所支持的数据类型为数值类型,boolean类型,returnAddress类型。数值类型又分为整数和浮点数类型。整数类型包括:byte类型 8位有符号的二进制补码整数,默认值为0;short类型 16位有符号的二进制补码整数,默认值为0  int类型 32位有符号的二进制补码整数,默认值为0;long类型 64位有符号的二进制补码整数,默认值为0;char类型:16位无符号整数表示;float类型:单精度浮点整数集合;double类型是多精度浮点整数集合。    boolean类型:Java虚拟机中对boolean类型提供支持非常优有限,Java编译器把Java语言中的boolean类型值映射为int行的true=1,flase=0

     1.2引用数据类型和值:

         Java虚拟机中有三种引用类型:类类型。数组类型和接口类型。引用类型的值中有一个特殊的值是null,代表当前引用不指向任何一个对象

2.运行时数据区:

1.pc寄存器:Java虚拟机支持多线程同时执行,每一条Java虚拟机线程都会有自己的pc寄存器。pc寄存器是线程私有的。pc寄存器是用来记录字节码的行号。如果方法不是native的,那么pc寄存器保存Java虚拟机正在执行的字节码指令的地址,如果是native,则pc寄存器的值为undefined。Java虚拟机多线程是通过轮转切换分配处理器执行时间来实现的。当轮转到本线程时候,pc寄存器记录的行号开始执行。

2.Java虚拟机栈

Java虚拟机栈的作用与传统c语言的栈类似,用于存储局部变量还有一些未算好的解决。Java虚拟机栈是属于隔离线程部分,也就是线程私有,他的生命周期与线程的生命周期相同。他主要可分为:局部变量区、运行环境区、操作数区。Java虚拟机栈的结束方式主要用调用System.exit(),程序结束,或者出现问题和系统推出。局部变量区存储着各种基本数据类型(boolean,byte,shot,int,float,double)和引用类型(refrence)但是他不是对象本身,而是对象的起始地址的引用指针,也可能代表句柄或者和其他对象相关的地址,其中float,double类型是暂用两个局部内存空间。

3.Java堆:

堆是可供各个线程共享的内存区域,也是可供所有类实力和数组对象分配内存区域。Java堆在虚拟机启动的时候就被创建,他储存了垃圾收集器所管理的各种对象。堆中的垃圾收集器收集的方法有很多中。也有许多步骤。

首先我们要确定对象是否已经死亡。一般而言确定的方法有两种,第一种是引用记数法,基本原理是,在对象创建的时候伴随创建一个引用记数器,每一次引用对象给计数器加1,释放对象则减一,如果引用计数器为0的时候代表可以回收,据说python中的对象则使用这种方法标记,而Java中的标记则使用根搜索算法,

类如上图中(图片引用:http://www.cnblogs.com/gw811/archive/2012/10/19/2730258.html)

与GC Roots链接的object为不删除对象,未连接的标记删除。

早期的回收算法为:标记清除算法,顾名思义就是用搜索算法标记的需要被清除对象,在清除阶段进行清除。复制算法:用内存按容量分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另外一块内存上面,然后再把已使用过的内存空间一次清理掉。标记整理算法:该算法标记的过程与标记—清除算法中的标记过程一样,但对标记后出的垃圾对象的处理情况有所不同,它不是直接对可回收对象进行清理,而是让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。

 

4 方法区:可供各线程共享的运行时内存区域。是堆的逻辑组成部分,但是不进行垃圾回收。方法区用于存储被记录虚拟机加载的类信息,常量,静态变量等数据。

 

5.本地方法栈:本地方法栈和虚拟机栈的作用非常相似,区别在于Java虚拟机栈为Java方法提供服务,而本地方法栈伟Native提供服务。Native的调用主要是方法中一些不有Java语音代码琐屑的,还有Java语言

5.直接内存:直接内存并不是虚拟机运行数据区中的一部分。但是在jdk1.4中新加入Nio类的时候引入一种基于管道与缓冲区的I/O联系方式。

 

© 著作权归作者所有

共有 人打赏支持
laohng1995
粉丝 11
博文 37
码字总数 30590
作品 0
杭州
程序员
面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb
05/12
0
0
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
07/11
0
0
用思维导图来学java虚拟机,轻松易懂!

说明 本篇文章是对周志明的《深入理解Java虚拟机》的读书笔记,思维导图使用Mindjet MindManager。曾经看到过这样一句话: 关于教育,有一个经典的定义是:把在学校里学到的东西全部忘掉,最...

小刀爱编程
10/12
0
0
[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱?

[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱? 曾经的我经常害怕处理与JVM相关的异常,对JVM的配置参数也一无所知,那时候我天真地认为,JVM的出现本身就是想让程序员屏蔽实现细节,...

原创小博客
07/19
0
0
深入理解JVM学习笔记(一、总览)

1、JVM历史 2、JVM内存结构 3、JVM垃圾回收机制 4、JVM性能监控工具 5、JVM性能调优案例时间 6、JVM类文件结构 7、JVM类加载机制 8、JVM字节码执行引擎 9、JVM虚拟机编译及其运行时优化 10、...

jintaohahahaha
05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
7
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
3
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
18
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部