从内存泄露、内存溢出和堆外内存,JVM优化参数配置参数

VSole2022-08-02 10:01:47

内存泄漏

内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费。

内存泄漏最终会导致OOM。

造成内存泄漏典型场景:

1.单例模式的不正确使用

单例对象在初始化后将在JVM的整个生命周期中以静态变量的方式存在。如果单例对象持有对外部对象的引用,那么这个对象将不能被JVM正常回收

2.数据库、网络、IO连接没有被关闭释放

这类连接,一般会提供close方法进行显式关闭。但如果没有进行close,是不会自动被gc回收的。

3.不合适的对象引用

比如,生命周期长的对象持有生命周期短的对象的引用就很容易造成内存泄漏,尽管生命周期短的对象已经不再需要,但是因为生命周期长的对象持有对它的引用而导致不能被回收。

内存溢出

内存溢出即out of memory简称OOM。当程序申请内存时,没有足够的内存空间供其使用,往往会出现OOM。比如申请了一个Integer,但给它存了Long类型才能存下的数,那就会导致内存溢出。

堆外内存

对于堆外内存是指分配的对象直接受操作系统管理的JVM内存堆以外的空间。同时因为这部分区域直接受操作系统的管理,别的进程可以直接通过操作系统对其进行访问,减少了从JVM中复制数据的过程。

堆外内存适用生命周期较长的对象,具有以下特点:

  1. 可以很方便的自主开辟很大的内存空间,对于大内存有良好的伸缩性
  2. 减少垃圾回收带来的系统停顿时间
  3. 在进程间可以共享对象,减少JVM间的复制过程
  4. 适合那些分配次数少,读写操作频繁的场景

但也存在如下缺点:

  1. 容易出现内存泄漏,并且很难排查
  2. 堆外内存的数据结构不直观,当存储结构复杂的对象时,会浪费大量的时间对其进行串行化

常用JVM配置参数

-Xms:JVM初始最小堆内存
-Xmx:JVM允许最大堆内存
-XX:PermSize:JVM初始非堆内存
-XX:MaxPermSize:JVM允许最大的非堆内存
-XX:+UseConcMarkSweepGC:年老代激活CMS收集器,可以尽量减少fullGC
-XX:+UseParNewGC:设置年轻代为多线程并行收集
-XX:+UseCMSCompactAtFullCollection:在full gc时,对老年代的压缩(CMS的时候,会导致内存碎片,使内存空间不连续,可能会影响性能,但是可以消除碎片)
-XX:CMSInitiatingOccupancyFraction:当老年代被占用空间达到一定比例时触发CMS垃圾收集
-Xverify:none:类加载的时候关闭字节码验证
-XX:+DisableExplicitGC:告诉JVM关掉System.gc
-XX:+CMSParallelRemarkEnabled:再标记算法,降低标记停顿时间
-XX:+PrintHeapAtGC:打印GC前后的详细堆栈信息,主要用于生产环境或者压力测试时候看的信息
-XX:+PrintGCTimeStamps:输出GC的时间戳
-XX:PretenureSizeThreshold:使大对象直接进入老年代
jvm内存溢出
本作品采用《CC 协议》,转载必须注明作者和本文链接
内存泄漏最终会导致OOM。造成内存泄漏典型场景:1.单例模式的不正确使用单例对象在初始化后将在JVM的整个生命周期中以静态变量的方式存在。如果单例对象持有对外部对象的引用,那么这个对象将不能被JVM正常回收2.数据库、网络、IO连接没有被关闭释放这类连接,一般会提供close方法进行显式关闭。
无论对于Java程序员还是大数据研发人员,JVM是必须掌握的技能之一。Java提供的GC功能可以自动监测对象是否超过作用域等从而达到自动回收内存的目的,可以有效防止内存泄露,有效的使用可用内存。
堆区分为两大区:Young区和Old区,又称新生代和老年代。在不同的JVM实现及不同的回收机制中,堆内存的划分方式是不一样的。相对于基于寄存器的运行环境来说,JVM是基于栈结构的运行环境。在活动线程中,只有位于栈顶的帧才是有效的,称为当前栈帧。正在执行的方法称为当前方法,栈帧是方法运行的基本结构。在执行引擎运行时,所有指令都只能针对当前栈帧进行操作。而StackOverflowError表示请求的栈溢出,导致内存耗尽,通常出现在递归方法中。
Java 8 的内存结构
2022-03-10 14:37:13
java8内存结构图虚拟机内存与本地内存的区别Java虚拟机在执行的时候会把管理的内存分配成不同的区域,这些
同时例如 jstack、jmap 等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。CPU 异常往往还是比较好定位的。
JDK8是近年来Java最重要的一次更新。其引入的一系列函数式编程特性,例如lambda表达式,已经被Java开发者广泛使用。然而,lambda的使用也存在缺陷漏洞以及兼容性等问题。我们针对这些问题开展了实证研究并获得了重要发现。
容器安全工具涵盖多种任务,包括配置加固和漏洞评估任务。Gartner持续观察AST市场发展的主要驱动力是支持企业DevSecOps和云原生应用程序的需求。Checkmarx SCA的供应链安全执行行为分析,并对给定的开源包添加操作风险指标。这得到了Gartner客户的积极反馈。Checkmarx一直在简化软件许可,将大多数产品与开发人员的数量联系起来。
随着Web应用攻击手段变得复杂,基于请求特征的防护手段,已经不能满足企业安全防护需求。在2012年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP,属于一种新型应用安全保护技术,它将防护功能“ 注入”到应用程序中,与应用程序融为一体,使应用程序具备自我防护能力,当应用程序遭受到实际攻击伤害时,能实时检测和阻断安全攻击,而不需要进行人工干预。实现了在攻击链路最关键的地方阻断攻击。
Target用于修饰注解的注解,定义当前注解能够修饰程序中的哪些元素@Documented. Documented用于指定被该元注解修饰的注解类将被javadoc工具提取成文档。Inherited被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。是@Before和@AfterReturing 相结合3.3 技术实现根据任务背景,我选择了返回通知@AfterReturning。使用返回通知一定要注意的是:由于我需要用到返回值,所以会用@AfterReturning注解中的returning属性来获取方法的返回值returning指定
立即隔离被入侵的主机,以控制事态、避免影响扩大,随后溯源。Webshell文件本身极难检出,防守队员很清楚,当发现主机上有Webshell文件时,往往意味着这台主机即将失陷,十分危险。但是Webshell文件已经被删除,攻击者仍能做出攻击行为,说明主机上还存在另一条控制通道。
VSole
网络安全专家