内存溢出

JVM---内存结构

筅森魡賤 提交于 2019-12-16 00:23:47
程序计数器 Program Counter Register 是记住下一条JVM指令的执行地址 特点 是线程私有的 不会存在内存溢出 虚拟机栈 每个线程运行所需要的内存,成为虚拟机栈 每一个栈是由多个栈帧组成,栈帧是每个方法运行时需要的内存,一个栈帧对应着一个方法调用 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法 垃圾回收是否涉及栈内存? 不会,栈内存是一次次的方法调用产生的栈帧内存,而栈帧内存在方法调用完成后,会自动出栈。 栈内存分配越大越好吗? 通过参数-Xss size参数来指定栈的大小 栈内存如果分配的大,则可以执行的线程数,越来越少,因为物理内存是一定的。 方法内的局部变量是否是线程安全? 局部变量是线程私有的,所以是线程安全的 如果变量是多个共享的,则需要考虑线程安全问题 总结:如果方法内的局部变量没有逃离方法的作用范围,它是线程安全的 如果局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全 (引用作为参数,作为返回值) /** * 局部变量的线程安全问题 */ public class Demo1_17 { public static void main ( String [ ] args ) { StringBuilder sb = new StringBuilder ( ) ; sb . append ( 4 ) ; sb . append (

JVM调优

喜欢而已 提交于 2019-12-15 03:13:19
1、JVM调优目标:使用较小的内存占用来获得较高的吞吐量或者较低的延迟。 程序在上线前的测试或运行中有时会出现一些大大小小的JVM问题,比如cpu load过高、请求延迟、tps降低等,甚至出现内存泄漏(每次垃圾收集使用的时间越来越长,垃圾收集频率越来越高,每次垃圾收集清理掉的垃圾数据越来越少)、内存溢出导致系统崩溃,因此需要对JVM进行调优,使得程序在正常运行的前提下,获得更高的用户体验和运行效率。 这里有几个比较重要的指标: 内存占用:程序正常运行需要的内存大小。 延迟:由于垃圾收集而引起的程序停顿时间。 吞吐量:用户程序运行时间占用户程序和垃圾收集占用总时间的比值。 当然,和CAP原则一样,同时满足一个程序内存占用小、延迟低、高吞吐量是不可能的,程序的目标不同,调优时所考虑的方向也不同,在调优之前,必须要结合实际场景,有明确的的优化目标,找到性能瓶颈,对瓶颈有针对性的优化,最后进行测试,通过各种监控工具确认调优后的结果是否符合目标。 2、JVM调优 (1)调优可以依赖、参考的数据有系统运行日志、堆栈错误信息、gc日志、线程快照、堆转储快照等。 ①系统运行日志:系统运行日志就是在程序代码中打印出的日志,描述了代码级别的系统运行轨迹(执行的方法、入参、返回值等),一般系统出现问题,系统运行日志是首先要查看的日志。 ②堆栈错误信息:当系统出现异常后,可以根据堆栈信息初步定位问题所在

JVM的内存区域划分(jdk7和jdk8)

丶灬走出姿态 提交于 2019-12-13 19:59:15
前言 1、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 2、JRE/JDK/JVM是什么关系 JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。 JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。 JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。 3、JVM执行程序的过程

Tomcat 内存溢出对应解决方式

早过忘川 提交于 2019-12-12 14:50:33
1.Tomcat内存溢出的原因   生产环境中Tomcat内存设置不好很容易出现内存溢出。造成内存溢出是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况: OutOfMemoryError: Java heap space OutOfMemoryError: PermGen space OutOfMemoryError: unable to create new native thread.   Tomcat内存溢出解决方案 对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。(-Xms -Xmx -XX:PermSize -XX:MaxPermSize) 最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。 回到顶部 2.OutOfMemoryError 堆内存溢出 a.原因分析: JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置. JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。 可以利用JVM提供的-Xmn - Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion

JVM内存区域与内存溢出异常

你离开我真会死。 提交于 2019-12-11 03:46:43
序言:在java应用中,内存溢出是很常见的问题.只有了解内存区域的分布和各自负责的功能,我们才能在编写代码时注意编码质量,并且在发生溢出异常的时候能够根据异常提升快速找到溢出原因。 1:JVM虚拟机所管理的内存包括以下几个区域,如图所示: 1.1 Java堆内存 对于我们应用环境来说,堆内存的占比是Jvm所管理内存是最大的。该内存是被所有线程所共享的,在虚拟机启动的时候被分配。 应用程序中大部分的对象的实例和数组都会在堆上被创建( 涉及JIT,对象逃逸技术 )。这一块也是垃圾回收器管理的主要区域(后续会在垃圾回收机制中描述) 1.2 方法区 方法区和java堆一样,也是被线程所共享的,该区域主要存放的是虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码(这是一种规范)。不论是jdk1.6-jdk1.7中的永久代还是jdk1.8的元空间其实都是方法区这个规范的具体实现(针对的是Sun HotSpot虚拟机来说)。下面是HotSpot对于 常量池从方法区移到堆中(jdk1.7开始) 取消了永久代,使用元空间(Metaspace)替代(1.8开始) 那么对应的虚拟机加载的类信息(class matadata)也从1.7的永久代中转移到了元空间中 永久代中的静态变量转移到堆内存中(jdk1.8开始) 永久代参数PermSize(设置方法区初始值大小)和 MaxPermSize

记一次内存溢出

戏子无情 提交于 2019-12-10 17:24:51
java应用 内部调用lua处理战斗 几天后线上运行卡顿 lua对象持续增长 线上紧急重启后运行2天的内存信息 对象信息 jmap -histo:live 10342 |grep lua 内存信息 ( G1 jstat、jmap 查看survivor 始终100% 因为和其他垃圾回收器不同的是 sur0 sur1地址不固定 ) gc信息 看下当前内存分配 显示配置和G1的默认参数 -Dfile.encoding=UTF-8 -Xms5g -Xmx5g -Xss256K -XX:MaxMetaspaceSize=128m - XX:CompressedClassSpaceSize=64m -XX:+UseG1GC -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 没有问题 dump日志 Histogram 和jmap histo:live查出来的一致 猜想:都是luatable的内部类 逻辑中又有很多new luaTable的地方 是不是有泄漏的地方呀 immediate dominator找责任对象 先找他的 再查table的 看着并不是 最后发现是lua脚本有问题 来源: CSDN 作者: 20481024 链接: https://blog.csdn.net/zt011052/article/details/103459819

Android中如何避免OOM

血红的双手。 提交于 2019-12-10 08:19:48
手机内存比较小,随时可能发生溢出的情况,所以避免内存泄露非常重要,否则程序二话不说直接崩溃。。下面的内容总结一下自己的经验以及学习成果。有错误或者有补充的欢迎跟帖讨论。 1.避免对activity的超过生命周期的引用。(尽量使用application代替activity)。因为程序一般是由很多个Activity构成的,从一个Activity跳转了以后,系统就有可能回收这个Activity的各种内存占用。可是此时如果你的一些不可回收变量(比如静态变量)保持了对此Activity对象的引用,那么GC就不会对此Activity进行回收,无故占用了大量的内存。这种情况最好的办法就是用application代替activity。用Context.getApplicationContext() 或者 Activity.getApplication()可以很方便的得到application对象。具体参考帖子 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=173353 2.有些不得不缓存在内存中的图片大字符串等,最好使用软引用或者弱引用。最经典的例子就是异步下载图片,图片会保存到一个HashMap中,下载一张就保存一张到HashMap中。此时hashmap中图片越来越多内存就容易不够用。软引用很好的解决了这个问题。当系统内存不足时

JVM(五) 生产环境内存溢出调优

扶醉桌前 提交于 2019-12-08 12:43:32
1.gc配置参数 1.1 控制台打印gc日志 -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC(详细的gc信息) 1.2 输出gc日志到指定文件 -Xloggc: (例如: -Xloggc:C:\logs\gc.log) 1.3 Gc日志分块 -XX:-UseGCLogFileRotation -XX:GCLogFileSize = 8M 1.4 指定最小堆内存 -Xms (例如-Xms20M指定最小堆内存为20M) 1.5 指定最大堆内存 -Xmx (例如-Xms20M指定最大堆内存为20M) 1.6 指定新生代内存大小 -Xmn (例如-Xmn10M指定新生代内存为10M) 1.7 指定eden区在新生代的占比 -XX:SurvivorRatio=8 (eden比S0,S1区比例为8:1:1) 1.8元空间设置大小 -XX:MetaspaceSize 初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。 -XX:MaxMetaspaceSize 最大空间,默认是没有限制的。 1.9 指定创建的对象超过多少会直接创建在老年代 -XX:PretenureSizeThreshold

spark map和mapPartitions的区别

做~自己de王妃 提交于 2019-12-07 20:39:57
spark map和mapPartitions的区别和使用场景 map和mapPartitions的主要区别: 1) map :一次处理一个元素的数据 2)mapPartitions:一次处理一批数据 mapPartitions的优缺点: 优点: 速度快 ,一次处理一批数据,即一次接收所有的partition数据,在map过程中需要频繁创建额外的对象(例如将rdd中的数据通过jdbc写入数据库,map需要为每个元素创建一个链接,而mapPartition为每个partition创建一个链接),则mapPartitions效率比map高的多。 缺点: 容易出现内存溢出 ,当接收的partition的数据量较大时,例如100万数据, 一次传入一个function以后,那么可能一下子内存不够,但是又没有办法去腾出内存空间来,可能就导致OOM(内存溢出);而map一般较少出现内存溢出。 mapPartitions()出现内存溢出时的解决方法: 将数据切成较多的partition: repartition(100).mapPartitions(xx) 设置较大的处理器内存 --executor-memory 8g 代码demo_1.py: 每个partition仅仅初始化一次 Personas对象 def spark_get_order_personal_res(): spark_conf

JVM内存溢出的定位与分析

被刻印的时光 ゝ 提交于 2019-12-06 14:09:12
一、初步认识 二、模拟内存溢出   2.1 ~ 编写测试类:TestJvmOutOfMemory。 编写代码,向List集合中添加100万个字符串,每个字符串由1000个UUID组成。 如果程序能够正常执行,最后打印ok。 package cn.itcast.jvm; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class TestJvmOutOfMemory { public static void main(String[] args) { List<Object> list = new ArrayList<>(); for (int i = 0; i < 10000000; i++) { String str = ""; for (int j = 0; j < 1000; j++) { str += UUID.randomUUID().toString(); } list.add(str); } System.out.println("ok"); } }   2.2 ~ 在 VM potions中设置参数。 -Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError 三、运行测试 四、导入到MAT工具中进行分析   4.1 ~