java内存区域与内存溢出异常

java虚拟机自动内存管理机制,不用像C/C++为每一个new操作去写配对delete/free代码
java虚拟机在执行java程序的过程中 会把内存划分为若干个不同的数据区域
程序计数器:执行字节码指令 分支 循环 跳转。
java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的
java虚拟机栈 线程私有,存储局部变量
本地方法栈为native方法服务
java堆 java heap 内存中最大的一块,所有线程共享,此内存区域的唯一目的就是存放对象实例
java堆是垃圾收集器管理的主要区域 DC堆
方法区 method area 存储虚拟机加载的类信息,常量 静态变量
运行时常量池是方法区的一部分

对象的创建 java是一门面向对象的编程语音,new关键字
1.虚拟机收到new指令后,检查这个指令是否能在常量池中定位到一个类的符号引用,是否被加载解析初始化过
2.虚拟机为新生对象分配内存,内存分配后,虚拟机对对象进行必要的设置,例如这个对象是哪个类的实例,如何才能找到类的元数据信息,对象哈希码,这些信息存放在对象的对象头之中(Object header)
3 new指令执行后,会执行方法
OOM
除了程序计数器,虚拟机内存的其他几个运行时区域都有发生outofmemoryerror异常的可能
java堆存储对象实例,在对象数量达到最大堆的容量限制后就会产生内存溢出异常
堆会自动扩展xms xmx
一般的手段是通过内存映像分析工具 eclipse memory analyzer
string.intern() 是一个native方法,如果字符串常量池中已经包含一个等于此string对象的字符串,则返回代表池中这个字符串的string对象

垃圾收集器与内存分配策略

其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭
java堆存放几乎所有实例,判断对象是否存活和死去
引用计算算法 引用+1,引用失效-1
可达性分析 ,当一个对象到GC root没用任何引用,即不可,则判定为可回收对象
强引用:GC永远不会回收掉被引用的对象
软引用:还有用并非必须的对象,在发生内存溢出之前,将会把这些对象列进回收范围
弱引用: 无论当前内存是否足够,都会回收掉弱引用关联的对象
执行finalize()方法
新生代GC Minor GC 指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生熄灭的特性,所以minor GC 非常频繁,回收速度快
老年代GC major GC/FULL GC 老年代GC的速度一般回避minorGC 慢十倍以上
大对象直接进入老年代
长期存活的对象进入老年代

类文件结构

代码编译的结果是从本地机器码转变为字节码
java虚拟机不和包括java在内的任何语言绑定,它只与‘CLASS’这种特定的二进制文件格式所关联
任何一门功能性语言都可以表示为一个java虚拟机接受的有效class文件,使用java编译器可以把java代码编译为存储字节码的class文件

虚拟机类加载机制

虚拟机把类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终可形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制
在java语言里,类型的加载,连接初始化过程都是在程序运行期间完成,虽会令类加载稍微增加一些性能开销,但能提高灵活性。
类从被加载到虚拟机内存中开始,到卸载出内存为止。整个生命周期包括,加载,验证,准备,解析,初始化,使用,卸载

JAVA 内存模型与线程

存储器在容量尤其是访问延时方面的性能增长越来越跟不上处理器性能发展的需要,菜肴层次化的存储器体系结构cache
java内存模型规定了所有的变量都存储在主内存main memory
每条线程还有自己的工作内存 working memory
volatile型变量 ,关键字volatile最轻量级的同步机制 只能保证变量的可见性
java内存模型特征:原子性 在一个操作是不可中断,要么全部执行成功要么全部执行失败,即使多个线程一起执行,也不会被其他线程干扰
可见性:当一个线程修改了这个变量的值,其他线程能立马知道,新值同步回主内存
有序性,线程内观察,所有操作是有序的

java与线程
线程是比进程更轻量级的调度执行单位,线程是CPU调度的基本单位
new新建 运行runable 无限期等待 waiting 阻塞blocked 结束terminated

线程安全和锁优化

线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果。
不可变就是线程安全 final关键字 string就是不可变,调用substring()replace()concat()都不会影响原来的值,只会返回一个新构造的字符串对象
线程安全的实现方法
互斥同步 同步是指多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个线程使用
在java中,最基本的互斥同步就是synchronized关键字

深入理解java虚拟机-笔记相关推荐

  1. java虚拟机内存分为,深入理解Java虚拟机笔记(一)----内存划分

    Java内存划分 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如下图 一.程序计数器 程序计数器(Program Counter Register)是一块很小 ...

  2. 深入理解Java虚拟机--笔记1

    Java内存区域与内存溢出异常 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域. 1 程序计数器--Program Counter Regis ...

  3. 深入理解Java虚拟机 笔记

    对象内存布局: 对象头 实例数据 对齐填充 对象头: Mark Word:存储自身的运行时数据,如hashcode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳 类型指针,指向其类 ...

  4. 深入理解java虚拟机 新生代_深入理解java虚拟机:笔记

    1.运行时数据区域 1.程序计数器 当前线程执行字节码的行号指示器,字节码解释器工作通过改变这个计数器的值来选取下一条需要执行的字节码指令,每一个线程拥有独立的程序计数器,线程私有的内存 2.虚拟机栈 ...

  5. 深入理解Java虚拟机笔记之六内存分配与回收策略

    对象的内存分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也可能会直接分配在老年代中,分配的规则并不是百分百固定的,其细节取决于当前使用的 ...

  6. 2020-5-9 开始阅读深入理解java虚拟机

    深入理解java虚拟机笔记 day1 读完前三章 关于Jit编译器和解释器和关系,见博客:https://www.cnblogs.com/insistence/p/5901457.html HotSp ...

  7. 《深入理解JAVA虚拟机》详细解读(第二章 ):JAVA内存区域与内存溢出异常

    目录 一.JAVA内存区域与内存溢出异常 1. 概述 2. 运行时数据区域 2.1 程序计数器 2.2 Java虚拟机栈 2.3本地方法栈 2.4 堆 2.5 方法区 2.6 运行时常量池 2.7直接 ...

  8. 《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记

    <深入理解Java虚拟机>阅读笔记 本repository为<深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)>阅读笔记,因为第一章主要讲的是Java的发展历史, ...

  9. 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解

    郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块 ...

最新文章

  1. python之接口开发
  2. 如何节省 1TB 图片带宽?解密极致图像压缩
  3. Linux下修改Swap分区大小
  4. Leetcode1:Two Sum
  5. GDOI2015 解题报告
  6. 领域建模——架构设计的第一步(下)
  7. Java方法实现是什么意思_Java中实现可调用的最佳方法是什么,需要一段时间才能完成...
  8. python 爬虫 使用selenium 控制浏览器 进行搜索操作
  9. [转载] 基于Python, Selenium, Phantomjs无头浏览器访问页面
  10. 2.SOA架构:服务和微服务分析及设计--- 理解面向服务架构
  11. MathType7新版本数学公式编辑器上线功能特性
  12. Springboot集成Swagger接口测试工具
  13. 负压电源设计 TPS54160 负压 Level Shifting Control for an Inverting Buck-boost
  14. Win10系统如何快速更改桌面文件夹图标
  15. PPT里怎么加入边翻页幻灯片边连续播放音乐?
  16. MySQL 报错:Could not acquire management access for administration 不能正确登录怎么办?
  17. unity捕鱼达人3----UI界面的制作以及相关功能的实现
  18. (个人学习)资金托管与资金存管的区别
  19. 《这就是软件工程师》读书笔记
  20. 陆奇最新演讲:2021年,程序员们应该如何提升自我?

热门文章

  1. i1U机架服务器做系统,微星MS-9211 1U 机架式服务器准系统
  2. Ubuntu 16.04安装Fcitx拼音输入法
  3. 怎么开qq远程连接服务器,QQ远程协助出现权限问题该怎么处理?不用慌这样保证解决...
  4. 项目管理案例分析:如何通过黄金圈法则建立共识?
  5. Python selenium实现全自动购买火车票
  6. 2022团体程序设计天梯赛
  7. 2020年腾讯丶百度丶字节丶OPPO等Android面试大全,附带教你如何写好简历
  8. 阿里云的mysql问题
  9. Sqlmap速查表/功能移植/Python批量检测SQL注入
  10. 【Java基础】集合总结(三)——Queue集合、Map集合