【深入Java虚拟机】之三:内存溢出
为了更直接的了解各区域,下面我们来看几个示例。
1、Java 堆溢出
下面的程中我们限制Java 堆的大小为20MB,不可扩展(将堆的最小值-Xms 参
数与最大值-Xmx 参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDump
OnOutOfMemoryError 可以让虚拟机在出现内存溢出异常时Dump 出当前的内存堆转储
快照以便事后进行分析。
参数设置如下




Java 堆内存的OutOfMemoryError异常是实际应用中最常见的内存溢出异常情况。出现Java 堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟着进一步提示“Java heap space”。要解决这个区域的异常,一般的手段是首先通过内存映像分析工具(如Eclipse Memory Analyzer)对dump 出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。图2-5 显示了使用Eclipse Memory Analyzer 打开的堆转储快照文件。
如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots 的引用链。于是就能找到泄漏对象是通过怎样的路径与GC Roots 相关联并导致垃圾收集器无法自动回收
它们的。掌握了泄漏对象的类型信息,以及GC Roots 引用链的信息,就可以比较准确地定位出泄漏代码的位置。
如果不存在泄漏,换句话说就是内存中的对象确实都还必须存活着,那就应当检查虚拟机的堆参数(-Xmx 与-Xms),与机器物理内存对比看是否还可以调大,从代码上
检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存消耗。
以上是处理Java 堆内存问题的简略思路,处理这些问题所需要的知识、工具与经验在后面的几次分享中我会做一些额外的分析。
2、java栈溢出
- package com.yhj.jvm.memory.stack;
- /**
- * @Described:栈层级不足探究
- * @VM args:-Xss128k
- * @author YHJ create at 2011-11-12 下午08:19:28
- * @FileNmae com.yhj.jvm.memory.stack.StackOverFlow.java
- */
- public class StackOverFlow {
- private int i ;
- public void plus() {
- i++;
- plus();
- }
- /**
- * @param args
- * @Author YHJ create at 2011-11-12 下午08:19:21
- */
- public static void main(String[] args) {
- StackOverFlow stackOverFlow = new StackOverFlow();
- try {
- stackOverFlow.plus();
- } catch (Exception e) {
- System.out.println("Exception:stack length:"+stackOverFlow.i);
- e.printStackTrace();
- } catch (Error e) {
- System.out.println("Error:stack length:"+stackOverFlow.i);
- e.printStackTrace();
- }
- }
- }
3、 方法区溢出
- package com.yhj.jvm.memory.methodArea;
- import java.lang.reflect.Method;
- import net.sf.cglib.proxy.Enhancer;
- import net.sf.cglib.proxy.MethodInterceptor;
- import net.sf.cglib.proxy.MethodProxy;
- /**
- * @Described:方法区溢出测试
- * 使用技术 CBlib
- * @VM args : -XX:PermSize=10M -XX:MaxPermSize=10M
- * @author YHJ create at 2011-11-12 下午08:47:55
- * @FileNmae com.yhj.jvm.memory.methodArea.MethodAreaOutOfMemory.java
- */
- public class MethodAreaOutOfMemory {
- /**
- * @param args
- * @Author YHJ create at 2011-11-12 下午08:47:51
- */
- public static void main(String[] args) {
- while(true){
- Enhancer enhancer = new Enhancer();
- enhancer.setSuperclass(TestCase.class);
- enhancer.setUseCache(false);
- enhancer.setCallback(new MethodInterceptor() {
- @Override
- public Object intercept(Object arg0, Method arg1, Object[] arg2,
- MethodProxy arg3) throws Throwable {
- return arg3.invokeSuper(arg0, arg2);
- }
- });
- enhancer.create();
- }
- }
- }
- /**
- * @Described:测试用例
- * @author YHJ create at 2011-11-12 下午08:53:09
- * @FileNmae com.yhj.jvm.memory.methodArea.MethodAreaOutOfMemory.java
- */
- class TestCase{
- }
- import java.util.ArrayList;
- import java.util.List;
- /**
- * @Described:常量池内存溢出探究
- * @VM args : -XX:PermSize=10M -XX:MaxPermSize=10M
- * @author YHJ create at 2011-10-30 下午04:28:30
- * @FileNmae com.yhj.jvm.memory.constant.ConstantOutOfMemory.java
- */
- public class ConstantOutOfMemory {
- /**
- * @param args
- * @throws Exception
- * @Author YHJ create at 2011-10-30 下午04:28:25
- */
- public static void main(String[] args) throws Exception {
- try {
- List<String> strings = new ArrayList<String>();
- int i = 0;
- while(true){
- strings.add(String.valueOf(i++).intern());
- }
- } catch (Exception e) {
- e.printStackTrace();
- throw e;
- }
- }
- }
5、直接内存溢出
- package com.yhj.jvm.memory.directoryMemory;
- import java.lang.reflect.Field;
- import sun.misc.Unsafe;
- /**
- * @Described:直接内存溢出测试
- * @VM args: -Xmx20M -XX:MaxDirectMemorySize=10M
- * @author YHJ create at 2011-11-12 下午09:06:10
- * @FileNmae com.yhj.jvm.memory.directoryMemory.DirectoryMemoryOutOfmemory.java
- */
- public class DirectoryMemoryOutOfmemory {
- private static final int ONE_MB = 1024*1024;
- private static int count = 1;
- /**
- * @param args
- * @Author YHJ create at 2011-11-12 下午09:05:54
- */
- public static void main(String[] args) {
- try {
- Field field = Unsafe.class.getDeclaredField("theUnsafe");
- field.setAccessible(true);
- Unsafe unsafe = (Unsafe) field.get(null);
- while (true) {
- unsafe.allocateMemory(ONE_MB);
- count++;
- }
- } catch (Exception e) {
- System.out.println("Exception:instance created "+count);
- e.printStackTrace();
- } catch (Error e) {
- System.out.println("Error:instance created "+count);
- e.printStackTrace();
- }
- }
- }
【深入Java虚拟机】之三:内存溢出的更多相关文章
- 深入理解java虚拟机【内存溢出实例】
通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...
- 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...
- java虚拟机涉及内存溢出
Java语言写的代码是.java文件,它会被特定程序编译(javac.exe,它会被Eclipse之类的IDE调用)成字节码(bytecode),字节码不能直接在CPU上运行,需要另一个程序读取并执行 ...
- Java 虚拟机的内存溢出
在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能. 在Eclipse中进行JVM参数设置 可以直接通过上方菜单栏的 ...
- java虚拟机(四)--内存溢出、内存泄漏、SOF
学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了 解内存溢出和内 ...
- 【java虚拟机】内存溢出与内存泄漏
作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/7354857.html 一.基本概念 内存溢出:简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提 ...
- 【java虚拟机】内存溢出解决思路
转自:https://blog.csdn.net/u013521220/article/details/79523633 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知 ...
- (一)深入java虚拟机之内存溢出与分析
一.内存溢出程序 public class Test { public static void main(String[] args) { List<User> userList=new ...
- 实战Java虚拟机之一“堆溢出处理”
从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...
- 实战Java虚拟机之三“G1的新生代GC”
今天开始实战Java虚拟机之三:“G1的新生代GC”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...
随机推荐
- 流程控制之 if 判断
语法一:if 条件: 代码1 代码2 代码3 gender='female'age=18is_beautiful=True if gender == 'female' and age > 16 ...
- 给zTree的treeNode添加class
onNodeCreated 回调,捕获 DOM 创建完毕的回调,然后利用 zTree 的规则找到 treeNode.tId + "_a" 这样的 标签,自行添加 class 就是了 ...
- 监控工具之zabbix server3.4 部署配置
[root@localhost src]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@localhost s ...
- 使用Python下载工具you-get下载媒体文件
You-Get是一个基于 Python 3 的下载工具.使用 You-Get 可以很轻松的下载到网络上的视频.图片及音乐. 使用you-get下载媒体文件 1.安装Python(步骤详情见另一篇文章) ...
- AlwaysOn配置时在连接步骤时报错(35250)
1.错误描述 1XX.XXX.XXX.241(主节点) 1XX.XXX.XXX.242(从节点) 添加节点需要在主节点上执行的,错误代码:35250 报错截图 2.网上相关介绍都是怀疑端口5022的问 ...
- 网络中的NAT模式
一.概述 NAT英文全称是"Network Address Translation",中文意思是"网络地址转换",它是一个IETF(Internet Engin ...
- Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization
用于理解恶意软件的内部工作原理,并发现系统中的漏洞,逆向工程是一种耗费人工的却很重要的技术.汇编克隆搜索引擎是通过识别那些重复的或者已知的部件来帮助逆向工程师的工作,要想设计健壮的克隆搜索引擎是一项挑 ...
- 【笔记】嵩天.Python语言程序设计.完成两个简单实例(温度转换和绘图)
[博客导航] [Python相关] 目标 使用PyCharm,完成两个小实例的编写和运行.一个是温度转换,一个是蟒蛇图形绘制. 过程 1.先设置project目录,虽然命名不是很正式,主要不太习惯软件 ...
- linux环境下快速安装Mariadb和Redis
一 Mariadb(Mysql)篇 1.新建一个yum源仓库 touch /etc/yum.repos.d/Mariadb.repo 2.在这个yum源仓库文件中,添加仓库url地址 [mariadb ...
- DRF项目创建流程(1)
一 web应用模式 前后端不分离 前后端分离 二 RESTFUL API规范 REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态 ...