扫码关注公众号:Java 技术驿站

发送:vip

将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】

【加作者微信交流技术,拉技术群】

# JVM内存划分与内存溢出小结 #

1.将堆的最小值(初始值)-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展,-Xmn参数设置堆中新生代容量大小,对应地,如果堆不可自动扩展情况下,老年代容量=(-Xms/-Xmx)-(-Xmn)

2.通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后分析,-XX:HeapDumpPath=d:/a.dump配置Dump出位置

3.对于HotSpot虚拟机来说,-Xoss参数(设置本地方法栈大小)虽然存在,但是实际无效,栈容量只由-Xss参数设定

> **而关于此,Java虚拟机规范描述了两个异常:**

>

> a,如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常(栈溢出)。

>

> b,如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常(堆溢出:堆溢出-OutOfMemoryError:java heap space,方法区溢出- OutOfMemoryError: PermGen space)。

>

> **测试:**

>

> a,定义大量的本地变量,增加此方法帧中本地变量表的长度(符合上面情况a),结果抛出StackOverflowError异常。

>

> b,使用-Xss参数减少栈内存容量(符合上面情况a),结果抛出StackOverflowError异常。

>

> **实验表明:**

>

> 在单个线程下,无论是由于栈帧太大,还是虚拟机栈容量太小,当内存无法分配时,虚拟机都将抛出StackOverflowError异常(都一个原因:栈帧所需>虚拟机容量)。

>

> 多线程下,才会进行扩展栈操作,才可能产生内存溢出异常。

>

> **原因:**

>

> 操作系统给每个进程分配的内存有限制,如32位是2GB,那么虚拟机进程本身消耗内存不计算在内的情况下,虚拟机栈和本地方法栈得到的内存=2GB-Xmx(最大堆容量)-MaxPermSize(最大方法区容量) ,程序计数器消耗内存小,忽略不计。这是一个定值,那么如果每个线程分配到的栈容量越大,还可建立的线程就越少,线程越多扩展栈时就越容易产生内存溢出异常,而单线程不存在扩展栈操作,只会比较该线程请求的栈深度与虚拟机最大深度而是否抛出StackOverflowError异常。

>

> **总结:**

>

> 对于开发时,出现StackOverflowError异常时,有错误堆栈可以阅读,比较容易找到问题所在,而且在虚拟机默认参数下,栈深度在大多情况下达到1000-2000没问题,对于正常方法调用(包括递归),这个深度已经完全够用了。

>

> 但是,如果是建立多线程导致内存溢出,要么减少线程数、要么更换64位虚拟机,否则,只能通过减少最大堆容量(为了加大栈空间)和减少栈容量(为了减少栈深度)来换取更多的线程。

>

> **备注:**

>

> A.栈帧:每个方法被执行时都会创建一个栈帧,用于存储局部变量表(方法内变量)、操作栈、动态链接、方法出口等信息。每个方法被掉调用到完成就对于一个栈帧在虚拟机栈中从入栈到出栈的过程。

>

> B.运行时数据区包括:

>

> > 1.虚拟机栈,本地方法栈:虚拟机栈和本地方法栈类似,一个执行Java方法(字节码),一个执行虚拟机的Native方法,也叫作本地方法(Java中声明的可调用的,使用C/C++实现的方法-JNI,HotSpot虚拟机直接将两者合并)。

>

> > 2.堆:堆存放对象(包含新生代和老年代,设置新生代大小-XX:NewSize=n)。

>

> > 3.程序计数器:记录执行代码行号。

>

> > 4.方法区:存放被虚拟机加载的类信息、常量、静态变量等,包含运行时常量池。类信息除了版本、字段、方法、接口、常量池(存放字面量和符合引用),常量池在类加载时会放入运行时常量池。

4.通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小

> **测试:**

>

> 通过上面jvm参数设置较小方法区大小(如10M),调用String.intern方法添加一个字符串到运行时常量池中,出现OutOfMemoryError: PermGen space异常。

>

> **实验表明:**

>

> 运行时常量池属于方法区。因为上面异常是方法区溢出。

>

> **备注:**

>

> String.intern(str)方法是一个native方法,作用是如果运行时常量池中包含一个等于str的字符串,就返回池中这个字符串的String对象,否则将str添加到池中并返回其引用。

5.类被GC回收的判定条件非常苛刻,所以,在经常动态产生大量class的应用中,应主要类的回收状态,如使用了GClib字节码增强的应用、大量jsp或动态产生jsp文件的应用、基于OSGi的应用

源自:《深入理解Java虚拟机:JVM高级特性与最佳实践》

【公告】版权声明

评论 抢沙发

有人回复时邮件通知我

提交评论

昵称昵称 (必填)

邮箱邮箱 (必填)

网址网址

java 内存溢出的分类_【深入理解Java虚拟机】读后感:JVM内存划分与内存溢出小结...相关推荐

  1. java中io是什么_深入理解Java中的IO

    深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...

  2. java spring boot 注解验证_如何理解Java原生注解和Spring 各种注解?

    作者:digdeep .cnblogs.com/digdeep/p/4525567.html 导引 Spring中的注解大概可以分为两大类: spring的bean容器相关的注解,或者说bean工厂相 ...

  3. java如果不使用多态_深入理解java多态没有烤山药的存在,java就不香了吗?

    @ 我不想知道各位理解java多态没有烤山药的存在,java香不香的问题了,我不要你们认为,我只要我觉得 (感觉要被打....) 在博主认为多态绝对是面向对象的第三大特性中让很多小白同学以及初学者难以 ...

  4. java对象的访问定位_深入理解java虚拟机---对象的访问定位(十)

    引用其他人的文章: https://www.cnblogs.com/YYfish/p/6722258.html 那是怎么访问对象呢? java 程序是通过栈上的reference数据来操作堆上的具体对 ...

  5. java垃圾回收策论_深入理解 Java 虚拟机【3】垃圾收集策略与算法

    作者:杨立滨 链接:https://github.com/yanglbme/jvm 程序计数器.虚拟机栈.本地方法栈随线程而生,也随线程而灭:栈帧随着方法的开始而入栈,随着方法的结束而出栈.这几个区域 ...

  6. java中对象的生存期_深入理解Java虚拟机-判断对象是否存活算法与对象引用

    我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题.另外,本文还要谈 ...

  7. java 注解处理器的作用_深入理解Java:注解(Annotation)--注解处理器

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  8. java中的工厂模式_深入理解Java的三种工厂模式

    一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 奔驰类 宝马类 简单工厂,既能生产宝马又能生产奔 ...

  9. java集合的添加方法_深入理解java集合框架之---------Arraylist集合 -----添加方法

    Arraylist集合 -----添加方法 1.add(E e) 向集合中添加元素 /** * 检查数组容量是否够用 * @param minCapacity */ public void ensur ...

  10. java 等待线程结束 框架_深入理解Java多线程与并发框架——线程的状态

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享!Java架构筑基​zhuanlan.zhihu.comJava架构筑基--专注于Java技术的研究与分享! 后续文章将首 ...

最新文章

  1. for里面调用方法 vue_Vue源码阅读连载之Vue实例
  2. idea项目启动不起来_这些教育创业项目你还不知道吗,赶紧收藏起来吧!
  3. ubuntu 16.04 x86_64中arm-none-linux-gnueabi-不起作用时的解决方案
  4. Redmi K50电竞版将全球首发超宽频马达:安卓阵营最大 售价不便宜
  5. DBSCAN聚类算法初探(五)
  6. 为什么哈希表的容量一定要是 2的整数次幂?
  7. 递归 dfs 记忆化搜索 动态规划
  8. CRT工具连接Linux操作手册
  9. 实验2-4-2 生成3的乘方表 (C语言)
  10. 电脑计算器_教训!19年中级败给了电脑计算器,CPA难道要步后尘?
  11. CSS(刷漆)学习总结
  12. 台式计算机组装注意事项,如何组装台式机 组装台式机配置注意事项【详解】...
  13. win10专业版激活后变成教育版的解决方法(亲测有效)
  14. 如何把图片制作成GIF动图?GIF图是怎样合成的?
  15. 如何安装微信解决小黑块问题(一定可以使用)
  16. Linux之ARM(IMX6U)裸机主频和时钟配置
  17. INTERVAL 用法 mysql
  18. CoreOS在儿童节发布了自己的分布式存储Torus
  19. javascript 中 caller 与 callee 的作用以及用法
  20. wordpress最佳架构_如何在2019年选择WordPress主题:最佳选择

热门文章

  1. 用pip安装tensorflow报错SyntaxError: invalid syntax
  2. 存储管理算法java代码
  3. 【网络安全】文件上传绕过思路总结
  4. 【Web安全】从xxe到phar反序列化
  5. 004 人物数据查找和代码编写
  6. Centos 7 上 查看MySQL当前使用的配置文件my.cnf的方法
  7. 1.9 多态性:什么是多态?
  8. PPT怎么在剪映_剪映怎么剪辑音乐?添加、分割、导入音乐,图文详解!
  9. diskgenius扩容c盘重启电脑卡住_电脑使用DiskGenius工具增加C盘空间的方法
  10. 一天1个机器学习知识点(二)