JVM--你常见的jvm 异常有哪些? 代码演示:StackOverflowError , utOfMemoryError: Java heap space , OutOfMemoryError: GC overhead limit exceeded, Direct buffer memory, Unable_to_create_new_native_Thread, Metaspace
直接上代码:

public class Test001 {
public static void main(String[] args) {
//java.lang.StackOverflowError 栈溢出错误, 这个是error 不是异常,因为StackOverflowError 是Error的子类
// 栈溢出, 递归方法,调方法
m1();
}
public static void m1(){
m1();
}
@Test
public void test02(){
// java.lang.OutOfMemoryError: Java heap space 堆溢出 这个是error Error的子类
// 堆溢出, 直接new 一个1G的大对象,就报异常了
ArrayList<int[]> list = new ArrayList<>();
while(true){
int[] ints = new int[1024];
list.add(ints);
}
//或者new 一个 大对象
//Object[] objects = new Object[1024 * 1024 * 1024];
}
}
class GC_OverHead_limit_demo1{
public static void main(String[] args) {
//jvm 参数设置: -Xms10m -Xmx10m -XX:+PrintGCDetails
// java.lang.OutOfMemoryError: GC overhead limit exceeded
// 这是错误
// 出现的原因: 执行垃圾回收的时间占比太大,实际工作时间太小, 默认情况下 GC话费时间超过98% ,并且垃圾回收的内存少于2%, 就会抛出此错误
int i = 0;
List<String> list = new ArrayList<>();
try {
while (true){
list.add(String.valueOf(++i).intern());
}
} catch (Exception e) {
System.out.println(i);
e.printStackTrace();
throw e;
}
}
}
class Direct_buffer_memory_demo{
private static final int BUFFER = 1024*1024*20; //20M
public static void main(String[] args) {
// 直接内存不属于 jvm 运行时数据区的一部分
// 对象存储的位置,不在jvm的堆中,而是在物理内存中(直接内存中,为内存的1/4), 这样直接内存中的对象不停增加,直到满了,而此时jvm 的 gc并不会执行,所以报这个错误
// java.lang.OutOfMemoryError: Direct buffer memory
// 怎样查看直接内存大小 sun.misc.VM.maxDirectMemory() /1024/1024 单位 m
// jvm 参数:设置堆最大为10m, -Xms10m -Xmx10m -XX:+PrintGCDetails 可以设置直接内存,如果不设置 和堆空间最大值相同
System.out.println(VM.maxDirectMemory() / 1024 / 1024);// 直接内存大小为 9m
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(10 * 1024 * 1024);//这里直接放10m 的缓存
}
}
class Unable_to_create_new_native_Thread_demo{
public static void main(String[] args) throws InterruptedException {
// 这个是高并发情况下 容易爆出的生产上的错误
// java.lang.OutOfMemoryError: Unable_to_create_new_native_Thread
// 一个应用进程里 创建了过个线程,直接撑爆最大上限, linux服务器默认普通用户一个进程创建线程上限为1024, 如果是root用户则无上限
// 解决方案: 遇到这个错误,分析程序是否需要这么多线程,改代码, 或者修改服务器配置,增加创建线程上限
// https://www.jianshu.com/p/103589cea5f5
// https://blog.csdn.net/east4ming/article/details/80179670
//这里模拟一个 main线程下 创建多个线程
AtomicInteger count = new AtomicInteger();
while(true){
new Thread(()->{
try {
count.getAndIncrement();
System.out.println(count.get());
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
//这个在win系统下 并没有测出错误结果, 在linux系统下 930多个就报错误了
}
}
class MetaSpace_demo1{
static class OOM_Test{
//静态内部类
}
public static void main(String[] args) {
// 1.8之后,元空间取代了 永久代, 且元空间不在 jvm的 运行时数据区,而是使用的本地内存
// jvm参数: -XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=10m
// 运行结果: 396 时候就报错误了; java.lang.OutOfMemoryError: Metaspace
/**
* 元空间 存放的信息:
* 1: 虚拟机加载的类信息
* 2: 常量池
* 3: 静态变量
* 4: 即使编译后的代码
*
* 所以: 不停地创建 静态类,存放到元空间,直到撑爆,报异常
*/
int i = 0;
try {
while(true){
i++;
//这里使用 cglib 生成代理类, 这个类是静态的,所以创建后放在元空间
//1, 创建工具类
Enhancer enhancer = new Enhancer();
//2, 设置父类
enhancer.setSuperclass(OOM_Test.class);
enhancer.setUseCache(false);//不使用缓存
//3, 设置回调函数
enhancer.setCallback(new MethodInterceptor(){
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o,args);
}
});
//4, 创建代理对象
Object o = enhancer.create();
}
} catch (Exception e) {
System.out.println(i);
e.printStackTrace();
}
}
}
JVM--你常见的jvm 异常有哪些? 代码演示:StackOverflowError , utOfMemoryError: Java heap space , OutOfMemoryError: GC overhead limit exceeded, Direct buffer memory, Unable_to_create_new_native_Thread, Metaspace的更多相关文章
- java 异常 java.lang.OutOfMemoryError: GC overhead limit exceeded 解决
一.异常如下: Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded ...
- AndroidStudio 编译异常java.lang.OutOfMemoryError: GC overhead limit exceeded
在build.gradle中的android{}添加如下脚本就可以顺利编译了 dexOptions { incremental true javaMaxHeapSize “4g” }
- 记一次由于引用第三方服务导致的GC overhead limit exceeded异常
最近笔者遇到一个问题 监控平台忽然告警 GC overhead limit exceeded 这个异常 第一反应估计是堆溢出了.于是各种各种jmap jstack下载堆栈文件和堆日志文件. 以下是 ...
- JVM 报 GC Overhead limit exceeded 是什么意思?
默认情况下,并不是等堆内存耗尽,才会报 OutOfMemoryError,而是如果 JVM 觉得 GC 效率不高,也会报这个错误. 那么怎么评价 GC 效率不高呢?来看下源码: 呢?来看下源码gcOv ...
- GC overhead limit exceeded,tomcat修改jvm内存
tomcat修改jvm内存 内存大小:-Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=512m -Dja ...
- spark异常篇-OutOfMemory:GC overhead limit exceeded
执行如下代码时报错 # encoding:utf-8 from pyspark import SparkConf, SparkContext from pyspark.sql import Spark ...
- eclipse:Tomcat设置jvm,解决java.lang.OutOfMemoryError: Java heap space 堆内存溢出
eclipse 有启动参数里设置jvm大小,因为eclipse运行时自己也需要jvm,所以eclipse.ini里设置的jvm大小不是具体某个程序运行时所用jvm的大小,这和具体程序运行的jvm大小无 ...
- JVM内存溢出分析java.lang.OutOfMemoryError: Java heap space
JVM内存溢出查询java.lang.OutOfMemoryError: Java heap space查出具体原因分为几个预备步骤 1.在运行java程序是必须设置jvm -XX:+HeapDump ...
- java heap space解决方法和JVM参数设置
在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java ...
随机推荐
- 编译Android 4.4源代码并烧录到Nexus4
环境准备: 基本环境:ubuntu-12.04-desktop-64bit(裸机或者Windows下虚拟机安装均可,14.04也可以) 其他要求:空闲磁盘空间100G以上,代码部分接近10G,内存越大 ...
- Python中pip安装报错Unable to create process using '....'
因为我本人在电脑上安装了python2和python3,所以在安装的时候,把两个python的安装目录都安装到G盘了.然后两个python的执行文件分别改成了 python2.exe 和 pytho ...
- Win64 驱动内核编程-4.内核里操作字符串
内核里操作字符串 字符串本质上就是一段内存,之所以和内存使用分开讲,是因为内核里的字符串太有花 样了,细数下来竟然有 4 种字符串!这四种字符串,分别是:CHAR*.WCHAR*.ANSI_STRIN ...
- 7.PHP Cookie与Session
Cookie与Session Cookie Cookie功能 创建cookie <?PHP setcookie("TMCookie" ,'www.baidu.com') ...
- CTF常见的加密和编码方法
目录 哈希摘要算法 对称加密算法 其他加密算法 编码 哈希摘要算法 以 root 加密为例. MD4:32位的摘要算法.2add09183d0b1dc0428701df9838fba MD5:32位 ...
- 【JavaScript】JS从入门到深入(复习查漏向
[JavaScript]JS从入门到深入(复习查漏向 pre 精细得学过一遍JS后才发现,原来之前CTF中有些nodejs的题目以及一些游戏题的payload就变得很好理解了. 基础知识 ECMASc ...
- 【python】Leetcode每日一题-最大数
[python]Leetcode每日一题-最大数 [题目描述] 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数. 注意:输出结果可能非常大,所以你需要返回一个 ...
- 第四部分 数据搜索之使用HBASE的API实现条件查询
因为数据清洗部分需要用到Mapreduce,所以先解决hbase的问题,可以用命令先在hbase存一下简单的数据进行查询,之后只要替换数据就可以实现了原本功能 在看该部分前,确保Hase API看了, ...
- 设了padding要减去盒高 和 line-height 行高
增加了padding 一定要减去相应的高度,不然整个元素的高度会增高(原高+padding) line-height:行高 1.行高要比字体大,不然字体会挤到一块去 2.若父盒子没有设置高度,则行高会 ...
- SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?
有个同学提出一个这样的疑问; 在业务系统中,数据一般都从sql中查询,类似使用where,order by,limit,聚合函数等,为什么还要用java8的Stream方法? 对这个问题,大家有什么见 ...