jvm02

java虚拟机内存管理

每个线程就是一个顺序的执行单元,线程共享区即多个线程共享同一块区域,线程独占区即每个线程都有自己的虚拟机栈,本地方法栈,程序计数器。

程序计数器是一个比较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器,位于线程独占区,如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果执行的是native方法,计数器的值为underfined

Java虚拟机栈

虚拟机描述的是java方法执行的动态内存模型

栈帧

每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成,用于存储变量表,操作数栈,动态链接,方法出口等。

局部变量表

存储编译期可知的各种基本数据类型,引用类型,returnAddress类型,

局部变量表的内存空间在编译期完成分配,当进入一个方法,这方法需要在帧分配多少内存是固定的,在方法运行期是不会改变局部变量表的大小(存储的只是对象的引用)

 1 public class Demo {
 2     
 3     public void tes() {
 4         System.out.println("方法执行....");
 5         tes();
 6     }
 7     
 8     public static void main(String[] args) {
 9         new Demo().tes();
10         
11     }
12 
13 }

方法执行....
方法执行....

........

Exception in thread "main" java.lang.StackOverflowError

若不限定栈的内存,将超过虚拟机的内存,或物理内存,将抛出 OutofMemory

本地方法栈

虚拟机栈为虚拟机执行java方法服务,本地方法栈为虚拟机执行native方法服务

 

java堆

存储对象实例

垃圾收集器管理的主要区域

新生代,老年代

 

方法区

存储虚拟机加载的类信息(类的版本,字段,方法,接口),常量,静态变量,即使编译器编译后的代码等数据。

方法区和永久代

垃圾回收在方法区的行为(针对常量池的回收以及对象类型的卸载等)

异常的定义

OurOfMemoryError

 

运行时常量池,属于方法区的

 1 public class Test {
 2     
 3     public static void main(String[] args) {
 4         String s1 = "abc";//字节码常量
 5         String s2 = "abc";//字节码常量  
 6         System.out.println(s1 == s2);
 7         
 8         String s3 = new String("abc");
 9         
10         System.out.println(s1 == s3);
11         
12         System.out.println(s1 == s3.intern());//运行时常量  
13         
14     }
15     
16     /**
17      *  true
18         false
19         true
20      */
21 }

 

任何字符串的创建都会放在常量池中,常量池在方法区中,运行时常量池维护了StringTable字符串表,数据类型可以是HashSet ,存放所实例的字符串对象,由于hashSet的无序和不可重复, abc 只创建了一个实例,即 s1 == s2

如果用new 创建一个对象一定是在堆内存开辟空间,不再考虑常量池的问题

intern()作用在jdk1.7之后是查看常量池中是否存在和调用方法的字符串内容一样的字符串,如果有的话,就返回该常量池中的字符串,若没有的话,就在常量池中写入一个堆中该字符串对象的一个引用,指向堆中的该对象,并返回该引用。即是调用这个方法之后把字符串对象加入常量池中。

直接内存

能够分配堆外内存,不受到java虚拟机内存的制约,会受到当前操作系统物理内存的制约

 

对象的结构:

Header 对象头

  自身运行时数据(Mark Word)

    哈希值 GC分代年龄 锁状态标志 线程持有的索 偏向线程ID 偏向时间戳 

  类型指针

    对象指向它类的元数据的指针

InstanceData(相同的字段分配在一起)

  Long dobles    shorts/chars  

Padding,对齐填充不是必须的,占位符,对象的大小必须是8个字节的整数倍。

 

 

对象的访问定位

  使用句柄:指向堆中的句柄池,保存了实例对象的地址,引用地址不需要修改。

  直接指针,从引用类型直接指向真正的内存区域,速度快,性能高

两者都要保存  到对象实例数据的指针和到对象类型数据的指针

 

 

 

  

 

转载于:https://www.cnblogs.com/quyangyang/p/10997167.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建svn管理平台

安装svn服务器:yum -y install subversion创建svn的目录:mkdir -p /data/svn初始化svn目录:svnadmin create /data/svnconf下的三个目录介绍:authz:控制权限,创建用户。密码在passwd创建 passwd:密码文件&…

Oracle dataguard 正常切换和应急切换

Oracle dataguard 正常切换和应急切换oracle dataguard提供异地容灾方案,能有效的防止单点故障和提供高可用技术,这里介绍dataguard正常主备切换和应急切换(应急切换模拟主库出现问题无法还原,备库脱离dataguard接管主库对外提供服务)1)Oracl…

shutil模块、json和pickle模块

shutil模块: 高级的文件、文件夹、压缩包处理模块 json和pickle模块 之前学过eval内置方法可以将一个字符串转化成Python对象,但eval方法是有局限性的,对于普通的数据类型,json.loads、eval都可以使用,但遇到特殊类型的…

SNI: 实现多域名虚拟主机的SSL/TLS认证

为什么80%的码农都做不了架构师?>>> 一. 介绍 早期的SSLv2根据经典的公钥基础设施PKI(Public Key Infrastructure)设计,它默认认为:一台服务器(或者说一个IP)只会提供一个服务,所以在SSL握手时…

我心目中的牛程序员、我们可以对比看看(人家还是看多年朋友面子上才肯帮忙1周,至少需支付1万元辛苦费)...

为什么80%的码农都做不了架构师?>>> 最近碰到客户整个网站改版的需要,非常短的时间里只有1周时间里,需要把整个B2C网站彻底的进行版面,我自己估算了一下,就是往死里干一天工作48个小时,1周也干…

Spring Boot(十四):spring boot整合shiro-登录认证和权限管理

Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro。安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求。在Java领域一般有Spring Security、Apache Shiro等安全框架,但是由…

通用权限管理系统组件 (GPM - General Permissions Manager) 不改数据库、甚至不写代码就集成铜墙铁壁权限管理组件...

为什么80%的码农都做不了架构师?>>> 越成熟的东西,越牛X的东西,越简单才对,简单才是硬道理,苹果的手机只有少数几个按键,苹果Ipad也很少的按钮,甚至连苹果的笔记本键盘都少一排&…

在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配

在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配器”,见 http://jingyan.baid…

偏差-方差分解(转)

1、定义 这里所说的偏差-方差分解就是一种解释模型泛化性能的一种工具。它是对模型的期望泛化错误率进行拆解。 样本可能出现噪声,使得收集到的数据样本中的有的类别与实际真实类别不相符。对测试样本 x,另 yd 为 x 在数据集中的标记,y 为真实…

用过C#的朋友可能认为它是一种十分安全的语言,其实C#也可以做到经典的缓冲区溢出。 本文章将用一个实例来描述C#究竟是如何发生缓冲区溢出的! 首先建立一个C# Console工程,并开启工程的“允许

用过C#的朋友可能认为它是一种十分安全的语言,其实C#也可以做到经典的缓冲区溢出。 本文章将用一个实例来描述C#究竟是如何发生缓冲区溢出的! 首先建立一个C# Console工程,并开启工程的“允许不安全代码”选项 键入代码: [csharp]…

COOKIE伪造登录网站后台

1.关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)的知识,xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除…

如何利用445端口进行入侵渗透 445端口入侵原因详细解析。大家在进行入侵渗透个人电脑的时候,经常会碰到各种各样的端口,比如135,1433,445,3306等端口,现在小编就给大家讲解下445端口如

如何利用445端口进行入侵渗透 445端口入侵原因详细解析。大家在进行入侵渗透个人电脑的时候,经常会碰到各种各样的端口,比如135,1433,445,3306等端口,现在小编就给大家讲解下445端口如何入侵。 445端口入侵…

项目复盘

前言 最近一年半多一直在做一个CMS项目,做了快两年了也没有上线,而且开发还走了不少,其中有不少原因是因为开发中频繁改动需求导致开发人员失去耐心,但是其中还有一个重要的原因就是架构设计的不好,导致很多服务的边界…

fiddler,他和其他抓包软件有什么区别,如何使用fiddler进行抓包

前言:本文章是搭配《批量获取微信公众号》一文,介于群里朋友很热情,我就趁着上班测完bug 来撰写该文章,那么读完本文,你会学习到什么呢? 什么是fiddler,他和其他抓包软件有什么区别&#xff0c…

安装CentOS6.8并配置网络图文解说亲测全过程

安装环境: 本文是在win10系统安装上VMWare并配置Centos6.8虚拟机。 准备工作 1.安装VMWare虚拟机 1.1下载VMWare12资源链接:https://pan.baidu.com/s/1AhfMSDXLO-aA0eMqnuMWHg 提取码:iftd 1.2安装VMWare,在安装过程中需要输入密钥…

Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。

Paxos算法是莱斯利兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。在工程实践意义上来说,就是可以通过Paxos实现多副本一致性,分布式锁&…

09、策略模式

2019独角兽企业重金招聘Python工程师标准>>> 策略模式与工厂模式最大的区别在于,策略模式注重的是对算法的维护,也可以理解为对算法的封装。而工厂模式,则只是负责创建类,在刚接触策略模式时候,往往与工厂模…

Java编写代理服务器(Burp拦截Demo)一

大家都知道大名鼎鼎的BurpSuite代理神器,对于抓取HTTP请求非常好用,偶然,一朋友问我Java应该如何去编写代理服务器(因为他想做某些东西),有没有相关的API 去实现,我想说,差不多你能想…

Rabbit MQ windows下安装

Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang。通过下面两个连接可以下载安装最新的版本: 下载并安装 Eralng OTP For Windows otp_win64_18.3.exe(erlang的环境)运行安装 Rabbit MQ Serve…

C++笔记(3)——string.h相关的一些小知识

strlen() 用于得到字符数组中第一个\0前的字符的个数&#xff0c;格式如下&#xff1a; strlen(数组); 例子&#xff1a; #include <stdio.h> #include <string.h>int main(){char str[10];gets(str);int len strlen(str);printf("%d\n", len);return 0…