- 浏览: 2141092 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
上篇文章,散仙整理了关于JVM的运行时的数据区以及各个区域,本篇我们就来看下各个区域发生异常代码的实战代码,以便于大家更容易在实际应用找到感觉。
1,JAVA堆溢出代码,需要设置JVM参数
生成的dump文件,可以使用Eclipse Memory Analyzer进行分析查看,注意下载的不是eclipse插件,直接可与双击运行的。下载地址
2,虚拟机栈和本地方法栈溢出
3,方法区和运行时常量池溢出
4,直接内存区异常:
5,String.intern()的使用,看下面例子
1,JAVA堆溢出代码,需要设置JVM参数
package com.test.jvm; import java.util.ArrayList; import java.util.List; /** * * 堆异常 * * VM参数 * -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 生成dump文件 *-XX:+PrintGCDetails //打印GC日志 * * **/ public class HeapOOM { static class OOMObject{ } public static void main(String[] args) { List<OOMObject> oom=new ArrayList<HeapOOM.OOMObject>(); while(true){ oom.add(new OOMObject()); } } }
[GC [PSYoungGen: 5066K->817K(5952K)] 5066K->3649K(19648K), 0.0086059 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] [GC [PSYoungGen: 5937K->816K(5952K)] 8769K->7014K(19648K), 0.0071084 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [GC [PSYoungGen: 5936K->832K(5952K)] 12134K->12141K(19648K), 0.0091434 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] [Full GC [PSYoungGen: 832K->0K(5952K)] [ParOldGen: 11309K->10673K(13696K)] 12141K->10673K(19648K) [PSPermGen: 2492K->2490K(21248K)], 0.1771161 secs] [Times: user=0.25 sys=0.00, real=0.18 secs] [Full GC [PSYoungGen: 5120K->0K(5952K)] [ParOldGen: 10673K->13682K(13696K)] 15793K->13682K(19648K) [PSPermGen: 2490K->2490K(21248K)], 0.0549867 secs] [Times: user=0.17 sys=0.00, real=0.06 secs] [Full GC [PSYoungGen: 2648K->2599K(5952K)] [ParOldGen: 13682K->13694K(13696K)] 16331K->16293K(19648K) [PSPermGen: 2490K->2490K(21248K)], 0.1501946 secs] [Times: user=0.28 sys=0.00, real=0.15 secs] [Full GC [PSYoungGen: 2599K->2595K(5952K)] [ParOldGen: 13694K->13692K(13696K)] 16293K->16287K(19648K) [PSPermGen: 2490K->2490K(21248K)], 0.0715712 secs] [Times: user=0.19 sys=0.00, real=0.07 secs] java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid7016.hprof ... Heap dump file created [27848402 bytes in 0.106 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2245) at java.util.Arrays.copyOf(Arrays.java:2219) at java.util.ArrayList.grow(ArrayList.java:213) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187) at java.util.ArrayList.add(ArrayList.java:411) at com.test.jvm.HeapOOM.main(HeapOOM.java:30) Heap PSYoungGen total 5952K, used 2771K [0x00000000ff960000, 0x0000000000000000, 0x0000000000000000) eden space 5120K, 54% used [0x00000000ff960000,0x00000000ffc14d28,0x00000000ffe60000) from space 832K, 0% used [0x00000000ffe60000,0x00000000ffe60000,0x00000000fff30000) to space 832K, 0% used [0x00000000fff30000,0x00000000fff30000,0x0000000000000000) ParOldGen total 13696K, used 13692K [0x00000000fec00000, 0x00000000ff960000, 0x00000000ff960000) object space 13696K, 99% used [0x00000000fec00000,0x00000000ff95f148,0x00000000ff960000) PSPermGen total 21248K, used 2523K [0x00000000f9a00000, 0x00000000faec0000, 0x00000000fec00000) object space 21248K, 11% used [0x00000000f9a00000,0x00000000f9c76e98,0x00000000faec0000)
生成的dump文件,可以使用Eclipse Memory Analyzer进行分析查看,注意下载的不是eclipse插件,直接可与双击运行的。下载地址
2,虚拟机栈和本地方法栈溢出
package com.test.jvm; /** * 栈异常 * 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError * 如果虚拟机在扩展栈时无法申请到足够的内存空间,将抛出OutOfMemoryError * VM Args:-Xss128k */ public class VMStacSOF { public int count=1; void add(){ count++; add(); } public static void main(String[] args)throws Throwable { VMStacSOF vss=new VMStacSOF(); try{ vss.add(); }catch(Throwable e){ System.out.println("stack的length: "+vss.count); throw e; } } }
Exception in thread "main" stack的length: 997 java.lang.StackOverflowError at com.test.jvm.VMStacSOF.add(VMStacSOF.java:15) at com.test.jvm.VMStacSOF.add(VMStacSOF.java:16) at com.test.jvm.VMStacSOF.add(VMStacSOF.java:16) at com.test.jvm.VMStacSOF.add(VMStacSOF.java:16) at com.test.jvm.VMStacSOF.add(VMStacSOF.java:16) at com.test.jvm.VMStacSOF.add(VMStacSOF.java:16)
3,方法区和运行时常量池溢出
package com.test.jvm; import java.util.ArrayList; import java.util.List; /*** * * * 方法区异常 * -XX:PermSize=3M -XX:MaxPermSize=3M * * */ public class MethodAreaOOM { public static void main(String[] args) { //保持常量引用,避免FULL GC List<String> list=new ArrayList<String>(); int i=0; while(true){ list.add(String.valueOf(i+"fdfd的说法弄得你辅导费多方面的发叫电缆附件的封疆大吏防静电发来的发动静分离定界符多久奋斗飞地方的飞").intern()); //System.out.println(i); i++; } } }
Exception in thread "Reference Handler" Error occurred during initialization of VM java.lang.OutOfMemoryError: PermGen space at sun.misc.Launcher$ExtClassLoader.getExtClassLoader(Launcher.java:141) at sun.misc.Launcher.<init>(Launcher.java:71) at sun.misc.Launcher.<clinit>(Launcher.java:57) at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1486) at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1468) Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Reference Handler"
4,直接内存区异常:
package com.test.jvm; import java.lang.reflect.Field; import sun.misc.Unsafe; /** * * 直接内存溢出 * -Xmx20M -XX:MaxDirectMemorySize=10M * 切换JDK1.6才有Unsafe这个类,在JDK1.7中不存在此类 * * */ public class DirectMemoryOOM { private static final int _1MB = 1024 * 1024; public static void main(String[] args) throws Exception { Field unsafeField = Unsafe.class.getDeclaredFields()[0]; unsafeField.setAccessible(true); Unsafe unsafe = (Unsafe) unsafeField.get(null); while (true) { unsafe.allocateMemory(_1MB); } } }
Exception in thread "main" java.lang.OutOfMemoryError at sun.misc.Unsafe.allocateMemory(Native Method) at com.test.jvm.DirectMemoryOOM.main(DirectMemoryOOM.java:24)
5,String.intern()的使用,看下面例子
package com.test.jvm; /*** * * String.intern()方法 * 测试 * intern()方法,会先从常量池,查找是否在方法区以及存在此对象的 * 引用,如果存在,就返回,如果不存在,就创建一个新的再放回去 * * **/ public class TestIntern { public static void main(String[] args) { String str1=new StringBuilder("我们").append("在这里").toString(); //这里打印true是因为,常量池不存在,此对象,故把此对象添加进去,然后再取出来,做比较,由于引用地址一样,故为true System.out.println(str1.intern()==str1); System.out.println("==================================================="); String str2=new StringBuilder("lon").append("g").toString(); //这里会输入false,是因为常量池里面已经存在,long ,int,java等字样,与刚创建的实例引用地址不一样,故为false System.out.println(str2.intern()==str2); } }
true =================================================== false
发表评论
-
记一次log4j不打印日志的踩坑记
2019-09-22 01:58 1446### 起因 前几天一个跑有java应用的生产集群(200多 ... -
在Java里面如何解决进退两难的jar包冲突问题?
2019-07-23 19:10 1137如上图所示: es api组件依赖guava18.0 ... -
如何轻松理解二叉树的深度遍历策略
2019-07-03 23:33 1007我们知道普通的线性数据结构如链表,数组等,遍历方式单一 ... -
为什么单线程Redis性能也很出色
2019-01-21 18:02 2127高性能的服务器,不一 ... -
如何将编程语言里面的字符串转成数字?
2019-01-11 23:23 1983将字符串转成数字在很 ... -
为什么Java里面String类是不可变的
2019-01-06 18:36 1579在Java里面String类型是不可变对象,这一点毫无疑问,那 ... -
关于Java里面volatile关键字的重排序
2019-01-04 18:49 978Java里面volatile关键字主 ... -
多个线程如何轮流打印ABC特定的次数?
2018-12-11 20:42 5924之前的一篇文章,我给 ... -
聊聊Java里面的引用传递
2018-11-16 21:21 925长久以来,在Java语言里面一直有一个争论,就是Java语言到 ... -
理解计数排序算法的原理和实现
2018-10-11 10:03 2044计数排序(Counting sort) ... -
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
2018-09-06 11:31 3329### 前言 理解HashMap和Con ... -
关于Java里面多线程同步的一些知识
2018-07-18 09:45 1058# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
Java单例模式之双检锁深入思考
2018-07-08 12:25 3237# Java单例模式之双检锁 ... -
关于Java里面多线程同步的一些知识
2018-07-08 12:23 1078# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
重新认识同步与异步,阻塞和非阻塞的概念
2018-07-06 14:30 1421# 重新认识同步与异步 ... -
线程的基本知识总结
2018-06-27 16:27 1016### (一)创建线程的方式 (1)实现Runnable接口 ... -
Java里面volatile关键字修饰引用变量的陷阱
2018-06-25 11:42 1323# Java里面volatile关键字修饰引用变量的陷阱 如 ... -
关于Java里面的字符串拼接,你了解多少?
2018-06-25 11:28 1309# 关于Java里面的字符串 ... -
深入理解Java内存模型的语义
2018-06-25 11:39 684### 前言 Java内存模型( ... -
如何证明Java多线程中的成员变量数据是互不可见的
2018-06-21 10:09 1449前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义, ...
相关推荐
深入Java虚拟机JVM类加载学习笔记:jvm java classloader 垃圾回收 gc
Java虚拟机JVM类加载学习笔记
JVM 学习笔记(Java虚拟机)
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...
自己有个习惯,学习新的知识喜欢一边看一边写笔记,这个是学习java虚拟机的时候写的笔记。
JVM深入理解Java虚拟机 - 学习笔记
包括jvm 的内存模型 对象的创建过程 垃圾回收算法 垃圾回收器 内存分配和回收策略
比较全面学习笔记文档,初学Java虚拟机建议下来看看
JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的,JVM屏蔽了与具体操作系统平台相关的信息,Java程序只需生成在Java虚拟机上运行的字节...
Java分布式应用学习笔记02再谈JVM
java虚拟机源码学习 Understanding the JVM 深入理解Java虚拟机第三版 (周志明)源码及学习笔记
《JVM必知必会》记录了对JVM的总结及学习笔记,详解的介绍了什么是jvm,以及弄清楚jvm的工作原理等等,会深入了解JVM有一定的帮助。 Java Virtual Machine(Java虚拟机),它bai是一个虚构出来du的计算机,是通过在...
Java基础学习笔记(印象笔记) Java 是一种广泛使用的面向对象编程语言,最初由 Sun Microsystems(现为 Oracle Corporation)于1995年发布。它具有简单、易学、可移植、安全和高性能等特点。 Java 是一种跨平台语言...
本文来自于cnblogs,为什么要学习Java虚拟机?它能干什么,文章从作者得角度带大家深入Java虚拟机相关内容,希望对大家有帮助。这里我们使用举例来说明为什么要学习Java虚拟机,其实这个问题就和为什么要学习数据结构...
title: 黑马JVM学习笔记二 date: 2020-01-13 1:00:00 tags: JVM categories: JVM 黑马jvm 内存结构 内存结构总览图: 程序计数器 1.定义:Program Counter Register 程序计数器 (寄存器) 程序计数器是Java对物理...
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...
java7 rt.jar源码 Java_JVM This is my Java JVM learn notes ...java虚拟机 一:上篇——内存与垃圾回收器 二:中篇——字节码与类的加载 ...主要的三款商用虚拟机JVM: 1) HotSpot JVM 特点: 热点代码探索
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...