深入理解java虚拟机(2)
一、对象的访问
-----------------------------------------------------
1.对象的访问与java栈、堆和方法区之间的关联关系。
eg:Object obj = new Object();
(1)这句话中Object obj对象的引用这部分的语义会保存在java栈的本地变量中,作为一个引用数据类型出现、、
(2)new Object() 创建对象的这部分语义会反映到java堆中,形成了一块存储了Object类型所有实例数据值的结构化内存,
二、outOfMemoryError异常
-------------------------------------------------------------
1.java堆溢出。堆用于存储对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆的容量限制后产生堆内存溢出异常。堆内存溢出时,异常堆栈信息"java.lang.OutOfMemoryError"会进一步提示"Java heap space"
2.解决这个区域异常一般方法是,通过映像分析工具分析内存中对象是否是必要的,分清楚是内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。如果是内存泄漏,可以通过工具查看到泄漏对象到GC Roots的引用链,于是就能找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾回收器无法自动回收垃圾的。掌握泄漏对象的类型信息,以及GC Roots引用链的信息就可以比较准确地定位出泄漏代码的位置;如果不存在泄漏问题,内存中的对象确实都还必须活着,那就应该检查虚拟机的参数(-Xmx与-Xms),与机器物理内存对比看是否还可以调大,从代码上看是否存在某些对象生命周期过长、持有状态时间过长的状况,尝试减少程序运行的内存消耗。
3.虚拟机栈和本地方法区溢出。栈容量设定只由-Xss参数决定。虚拟机栈和本地方法栈,在java中有两种异常:
(1)StackOverFlowError:如果线程请求的栈深度大于虚拟机允许的最大深度就会抛出这个错误。
使用-Xss参数减少栈内存容量,结果抛出StackOverflowError异常,异常出现的时候虚拟机栈深度相应的缩小
定义了大量的本地变量,增加了此方法帧中本地变量表的长度
(2)OutOfMemoryError:如果虚拟机在扩展栈的时候无法申请到足够的内存空间就会抛出这个错误
4.运行时常量池溢出
5.常量池溢出
6.方法区溢出。方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。
(1)对于这个区域测试:运行时产生大量的类来填满方法区,知道溢出。
深入理解java虚拟机(2)的更多相关文章
- 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
- 《深入理解 java虚拟机》学习笔记
java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.
- (1) 深入理解Java虚拟机到底是什么?
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java ...
- 深入理解java虚拟机(7)---线程安全 & 锁优化
关于线程安全的话题,足可以使用一本书来讲解这些东西.<Java Concurrency in Practice> 就是讲解这些的,在这里 主要还是分析JVM中关于线程安全这块的内容. 1. ...
- 深入理解java虚拟机(6)---内存模型与线程 & Volatile
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...
- 深入理解java虚拟机(5)---字节码执行引擎
字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...
- 深入理解java虚拟机(4)---类加载机制
类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...
- 深入理解java虚拟机(1)------内存区域与内存溢出
在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java ...
- 什么是HotSpot VM & 深入理解Java虚拟机
参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...
- 【Todo】深入理解Java虚拟机 读书笔记
有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M ...
随机推荐
- SpringBoot启动加载yml配置文件出现编码格式错误
Caused by: org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input l ...
- nginx location正则
nginx location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # ...
- leetcode-easy-listnode-237 Delete Node in a Linked List
mycode # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # sel ...
- JS - 获取函数的参数名称
看 Angular 依赖注入时发现的神奇的操作,实现原理是 Function.prototype.toString() 得到函数的字符串然后用正则判断. 参见 javascript - How to ...
- DatePicker 日期选择器
用于选择或输入日期 选择日 以「日」为基本单位,基础的日期选择控件 基本单位由type属性指定.快捷选项需配置picker-options对象中的shortcuts,禁用日期通过 disabledDa ...
- PyCharm安装+破解
PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,鉴于目前最新版 PyCharm 使用教程较少,为了节约时间,来介绍一下 PyCharm 在 Windows下是如何安装的. 这是 ...
- python3.5 字典遍历
1.遍历字典 dict={'} for key in dict: print(key+':'+dict[key]) ssh://root@192.168.0.204:22/usr/bin/python ...
- The window object
At the core of the BOM is the window object, which represents an instance of the browser. The window ...
- Oracle中 ORA-12704:字符集不匹配
前言 在使用Union all连接时,若A集合中某列为nvarchar2或nvarchar类型,而B集合中无此列,用‘ ’ 来代替是会报字符集不匹配 1 select '中国','China',cas ...
- centos7使用kubeadm安装kubernetes集群
参考资料:官方文档 一.虚拟机安装 配置说明: windows下使用vbox,centos17.6 min版,kubernetes的版本是1.14.1, 安装如下三台机器: 192.168.56.15 ...