精华内容
下载资源
问答
  • 怎么调整java的内存
    2021-03-03 16:31:41

    1、Java内存区域划分: 运行时的数据区:方法区和堆(各个线程共享的内存区域),程序计数器、Java虚拟机栈和本地方法栈(线程私有的) 程序计数器:当前线程所执行字节码的行号指示器,字节码解释器就是通过改变计算器的值来选取下一条需要执行的字节码指令,

    因为内存溢出问题

    1. Linux下直接修改%tomcat_home%/bin/catalina.sh文件

    在注释下紧接一行也就是脚本正文开始之前 加上

    JAVA_OPTS='-server -Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m'

    如果报-x没有定义,则用

    declare -x JAVA_OPTS="-Xms512m -Xmx1024"

    初始值和最大值自己根据实际情况可以更改.

    2.  Windows下通过Tomcat下直接启动可以直接修改%tomcat_home%/bin/catalina.bat文件

    在JAVA_OPTS修改

    set JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m原博客:http://blog.csdn.net/lengyuhong/article/details/5953544 近期看了看Java内存泄露的一些案例,跟原来的几个哥们讨论了一下,深入研究发现JVM里面还是有不少以前不知道的细节,这里稍微剖析一下。先看一看JVM的内部结构—— 如图所示,JVM主要包括两

    3.  如果是通过Myeclipse启动Tomcat修改

    Myeclipse配置选项  打开选项..输入tomcat关键字,然后点开Server下面的JDK就会出现配置区域.

    直接加入  -Xms128m -Xmx512m

    4..如果 是通过service.msc里的Tomcat服务启动Tomcat则需要修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation

    \Tomcat Service Manager\Tomcat6\Parameters\JavaOptions

    原值为

    -Dcatalina.home=”C:\ApacheGroup\Tomcat 6.0″

    -Djava.endorsed.dirs=”C:\ApacheGroup\Tomcat 6.0\common\endorsed”

    -Xrs

    加入 -Xms300m -Xmx512m

    更多相关内容
  • java内存设置

    2021-02-25 18:50:40
    由于各个系统的规模不一,所以遇到了一下在eclipse里调整VM启动参数的问题,拿出来分享下。JVM启动以后,会分配两类内存区域,一类用于开发人员使用,比如保存一些变量,对象等,一类JVM自己使用,比如存放一些class...

    最近进入天猫物流做运营支撑,需要在不同系统之间切换来切换去。由于各个系统的规模不一,所以遇到了一下在eclipse里调整VM启动参数的问题,拿出来分享下。

    JVM启动以后,会分配两类内存区域,一类用于开发人员使用,比如保存一些变量,对象等,一类JVM自己使用,比如存放一些class类和描述。

    一、第一类内存区域又可以分为栈(stack)、堆(heap),还有一些静态存储区域,这部分的内存在JVM启动的时候,可以用参数进行配置:

    1、-Xms 初始堆大小,这个值不能太小,其初始空间(即-Xms)是物理内存的1/64,这个值不能太小,比如 设置了-Xms1m,运行可能会出现:

    Error occurred during initialization of VM

    Too small initial heapfor new size specified

    2、-Xmx 堆大小上限,最大空间(-Xmx)是物理内存的1/4,如果程序中分配的内存超过了这个限制,那么会出现:

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    可以用代码测试下,譬如:

    byte[] b = new byte[100000000];

    3、-Xss  线程栈大小,一般不用设置,JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。有时候会发现一下异常:

    Exception in thread "main" java.lang.StackOverflowError

    原因一般是方法的递归或者死循环,导致栈空间不够用了,譬如:

    public static intcallMyself(){returncallMyself();

    }

    4、栈和堆到底存些什么,很多地方都有讲到,这里参考下《Think in java》的,栈里存放对象引用、基本类型的变量等,而堆里面存放对象和数组。方法的执行是在栈上进行的,这一点可以通过异常的时候,经常会默认打印栈信息得到:

    e.printStackTrace();

    5、Runtime类有几个函数,我们可以简单的通过这几个函数,看看JVM中的一些内存信息。

    maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时 候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下能 从操作系统那里挖到的最大的内存。如果添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512*1024*0124字节。

    totalMemory()这个方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的所有 内存。如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,直 挖到maxMemory()为止,所以totalMemory()是慢慢增大的。如果用了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖- Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。

    freeMemory()是什么呢,刚才讲到如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操 作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是 freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是如果你在运行java程序的时候使用了-Xms,这个时候因为程 序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可 能会有些大。

    譬如:

    Runtime rt =Runtime.getRuntime();

    info("Max memory: " +rt.maxMemory());long fisrt =rt.freeMemory();

    info("Total memory: " +rt.totalMemory());

    info("Free memory: " +fisrt);int size = 10000;byte[] b = new byte[size];long bL =rt.freeMemory();

    info("Free memory: " +bL);

    info("byte allocate Cost memory: " + (fisrt - bL) + ", Array size :" + size);

    运行参数设置为 -Xms8m -Xmx32m (太大了可能看不出来),运行结果为:

    2013-12-26 10:28:01: Max memory: 33357824

    2013-12-26 10:28:01: Total memory: 8323072

    2013-12-26 10:28:01: Free memory: 7791752

    2013-12-26 10:28:01: Free memory: 7781736

    2013-12-26 10:28:01: byte allocate Cost memory: 10016, Array size :10000

    33357824 <> 32*1025*1024(大约等于)

    8323072 <> 8×1024×1024

    最后看看10000长度的byte数组,分配了多少内存,大约为10016,这说明除了10000个大小为1字节的byte以外,还有16个字节其他的玩意。

    将byte换成int(4字节):

    2013-12-26 10:35:21: int allocate Cost memory: 40016, Array size :10000

    与byte相同,也是4*10000+16

    将byte换成long(8字节):

    201312-26 10:32:47: long allocate Cost memory: 80016, Array size :10000

    与byte相同,也是8*10000+16

    再看看String数组:

    2013-12-26 10:34:40: String allocate Cost memory: 40016, Array size :10000

    String作为一个对象,分配的内存大小与int相同,说明了这台机器是32(4*8)位的

    最后看看Object对象:

    2013-12-26 10:37:02: Object allocate Cost memory: 40016, Array size :10000

    结果与String一样。

    二、第二类内存,我了解的主要是PermGen space,全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,SUN的JDK在GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误。原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就 固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!这个后续再讨论。

    展开全文
  • java内存调优

    2021-11-04 14:31:09
    java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 简单来说堆就是留给开发人员使用的;非堆就是JVM留给 自己用的 内存调整大小 堆和非堆 调整堆大小 (程序运行内存) -server -Xms768m -Xmx768m 堆栈配置: java -...

    java内存组成介绍:堆(Heap)和非堆(Non-heap)内存
    简单来说堆就是留给开发人员使用的;非堆就是JVM留给 自己用的
    内存调整大小 堆和非堆
    调整堆大小 (程序运行内存)
    -server -Xms768m -Xmx768m
    堆栈配置:
    java -Xmx3550m –Xms3550m -Xmn2g -Xss128k
    -Xmx3550m:设置JVM最大堆内存为3550M,
    (Heap Size 最大不要超过可用物理内存的80%)。
    -Xms3550m:设置JVM初始堆内存为3550m。
    (此值一般设置与-Xmx相同),以避免每次垃圾回收完成后JVM重新分配内存。
    -Xmn2g:设置年轻代大小为2G(-Xmn为1/4的-Xmx值)。
    整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大  
    年轻代后,将会减小年老代大小。此值关系到jvm垃圾回收,对系统性能影响较大,Sun官方推荐配置为
    整个堆的3/8。
    -Xss128k:设置每个线程的堆栈大小。
    (JDK 5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K)。
    根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对
    一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
    Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值
    Heap Size +非堆 不能大于物理内存 80%

    jvm内存回收知识介绍:
    JVM不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。
    在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收。有的比如连接池共享的需要多次使用。
    因此jvm 设计了 分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收。
     
    如何分代
    虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。
    年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象
    在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
    持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
    由于触发GC(Garbage Collection,垃圾收集,垃圾回收)系统性能有影响
    什么情况下触发垃圾回收
    由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC和Full GC。
     

    展开全文
  •  如果是java内存不够的话,可以通过调整JVM下面的配置来解决:  <jvm>-Xms3062m  <jvm>-Xmx3062m  【情况二】  java.lang.OutOfMemoryError: GC overhead limit exceeded  【解释】:JDK6新增错误类型...
  • Java 内存调整技巧

    2011-01-06 10:52:57
    Java 内存调整技巧
  • 主要介绍了Java内存溢出实现原因及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Java内存结构与Java内存模型

    千次阅读 2021-12-02 17:13:40
    Java内存结构、内存模型、对象模型这几个概念经常会被混为一谈。理论知识容易忘写下来帮助记忆,方便以后查看。 1、Java内存结构 Java内存结构其实说的是JVM在运行时内存区域的划分,是根据Java虚拟机规范来实现的...

    Java内存结构、内存模型、对象模型这几个概念经常会被混为一谈。理论知识容易忘写下来帮助记忆,方便以后查看。

    1、Java内存结构

    JVM运行时内存区域
    Java内存结构其实说的是JVM在运行时内存区域的划分,是根据Java虚拟机规范来实现的。说的是JVM中划分出的各块内存区域分别用来干什么。如上图分为了5大块:方法区,虚拟机栈(有的叫方法栈也有叫线程栈的)、本地方法栈、堆、程序计数器(也有叫寄存器的)。其中方法区和堆是线程共享的内存区域,而虚拟机栈、本地方法栈和程序计数器是线程私有的,或者说是线程隔离的。

    1.1 程序计数器:

    它是当前线程执行字节码的指示器,通过改变它的值来选取下一条要执行的Java字节码指令。Java代码中的循环、跳转、异常处理、线程获得时间片后的恢复都需要依赖程序计数器。程序计数器所占内存很小,也是唯一一块不会出现内存溢出异常的内存区域。

    1.2 虚拟机栈:

    虚拟机栈是线程私有的,每一个线程都会分配一个虚拟机栈,它描述的是Java方法执行的内存模型,每个方法执行时都会同步创建一个栈帧,用于存储方法运行过程中需要的数据,指令,返回地址等信息。

    1.3 本地方法栈

    本地方法栈和虚拟机栈描述类似,区别只在于虚拟机栈描述的是Java方法,而本地方法栈描述的是Native方法(c++语言)。

    1.4 方法区

    它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区只是Java虚拟机规范中的一种理论思想,在jdk1.7之前这部分内容被存放于永久代中,在jdk1.8之后用元空间来代替。jdk的做法是理论的实现方式。永久代和元空间都可以通过jvm参数来调整其大小,不同的是元空间使用的是直接内存。

    1.5 堆

    堆是这几块内存区域中最大的一块,存放的是Java中几乎所有的对象实例。几乎所有对象也就是说不是全部,从jdk1.7之后开启了逃逸分析,感兴趣的可以查一查,它说的是当方法中的一个对象,未被外部引用并且未被方法返回,也就是说这个对象只在这个方法内有用,那么这个对象可以直接在栈上分配内存。

    2、Java内存模型(JMM)

    JMM
    JMM可以理解为Java模拟了cpu的硬件架构所规定的一种规范。由于cpu处理速度非常块比内存的读写速度要快很多,为了不妥协内存的读写速度,cpu引入了高速缓存,cpu要想修改主内存的值必须先将主内存中的数据拷贝到高速缓存中进行读取,然后再回写入主内存。
    从上节内容可知,Java堆和方法区域是多个线程共享的数据区域。也就是说,多个线程可以操作保存在堆或者方法区中的同一数据。
    JMM和多线程相关,它定义了一个线程对共享变量的写入对另一个线程是可见的。Java的多线程间是通过共享内存进行通信的,在通信过程中就会存在一系列如可见性、原子性、顺序性等问题。而JMM就是围绕多线程通信以及其相关的一系列特性而建立的模型。JMM定义了一系列语法集,这些语法集映射到Java中就是volatilesynchronized等关键字。

    展开全文
  • 如何设置Docker容器中Java应用的内存限制关注:85答案:2mip版解决时间 2021-01-30 11:46提问者时光盗走我的心2021-01-30 07:00如何设置Docker容器中Java应用的内存限制最佳答案二级知识专家寄出个心动2021-01-30 08:...
  • linux 改java内存大小

    千次阅读 2021-05-13 07:45:51
    linux 改java内存大小[2021-02-08 23:06:29]简介:linux查内存大小的方法:首先打开应用程序;然后选择系统工具选项,并单击系统终端选项;接着在系统终端命令行输入【free -h】命令;最后在结果中找到total即可...
  • linux 设置java内存

    千次阅读 2021-05-15 03:50:13
    linux 设置java内存[2021-02-03 18:47:06]简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。...
  • 主要介绍了Java内存溢出案例模拟和原理分析过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 本篇文章主要分析了JAVA程序内存溢出问题原因,较为详细的说明了java导致程序内存溢出的原因与解决方法,感兴趣的小伙伴们可以参考一下。
  • java 内存设置

    2021-03-26 10:49:53
    Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些 -Xmx:java heap最大值,使用的最大内存刘兵召写于2008-12-25 12:40 上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为...
  • 如何修改jvm内存 内存设置过大

    千次阅读 2021-02-12 23:19:59
    java虽然是自动回收内存,但是应用程序,尤其服务器程序最好根据业务情况指明内存分配限制。否则可能导致应用程序宕掉。-Xms128m:表示JVM Heap(堆内存)最小尺寸128MB,初始分配-Xmx512m:表示JVM Heap(堆内存)最大...
  • Java内存调优

    2022-06-28 12:06:34
    Java内存调优
  • java内存设置参数

    2021-02-12 23:47:46
    1、XmnXmsXmxXss有什么区别首先,Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。Xms、Xmx-Xms、-Xmx分配用来设置进程堆内存的最小大小和最大大小。...
  • 虚拟机内存的大小除了在web容器中设置,我们还可以通过系统环境变量来设置,下面看看设置步骤: 1.打开windows系统环境变量,在系统变量中,新建变量JAVA_OPTS,值设置为 -Xms1024M -Xmx2048M -XX:PermSize=256M -XX...
  • Java内存泄漏的排查

    千次阅读 2021-09-06 15:06:59
    1.内存溢出 一种通俗的说法。 1、内存溢出:你申请了10个字节的空间...java.lang.OutOfMemoryError,是指程序在申请内存时,没有足够的内存空间供其使用,出现OutOfMemoryError。 产生该错误的原因主要包括:JVM内存
  • 怎么调整eclipse的内存大小?设置Eclipse内存使用情况修改eclipse根目录下的eclipse.ini文件-vmargs //虚拟机设置-Xms40m -Xmx256m-XX:PermSize=128M //非堆内存设置-XX:MaxPermSize=256M2, JVM内存设置打开eclipse...
  • Java内存泄露如何排查

    千次阅读 2021-02-13 00:04:07
    Java内存泄露是常常出现的问题,Java攀登网进行了该问题的整理,具体的如下所示:1.2 内存泄露Memory Leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重...
  • 主要介绍了Java groovy内存回收测试步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Java内存模型,看这一篇就够了

    千次阅读 2022-05-09 23:32:23
    Java内存模型,是并发编程的基础,可以通过这篇文章了解到Java内存模型的相关内容,诸如CPU缓存一致性问题、Java内存模型同步的八种操作、同步规则、并发编程三大特性、happens-before原则、重排序等等
  • 一、前言 1、变量 Java内存模型的主要目标是...为了获得较好的执行效能,Java内存模型并没有限制执行引擎使用处理器的特定寄存器或者缓存来和主内存进行交互,也没有限制即使编译器进行调整代码执行顺序这类优化措施
  • 如何排查Java内存泄漏

    千次阅读 2021-07-28 13:29:24
    没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理。这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破坏内存泄漏的牺牲品。让我解释一下。 当不必要...
  • Tomcat 设置JVM内存大小

    千次阅读 2021-02-28 06:23:50
    $var _must_ be set to either true or false.JAVA_OPTS="-Xms1024m -Xmx4096m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048m"正文:常见的内存溢出有以下两种:java.lang.OutOfMemoryError:...
  • Java内存分析工具——jmap

    千次阅读 2022-04-15 11:20:49
    Java内存分析工具——jmap 平时我们在开发Java应用的时候,会涉及到分析对象内存、内存监控,那么就涉及到jmap这个工具,学习后来介绍一下 能干嘛? jmap 一般可用于: jmap能够打印给定Java进程、核心文件或远程...
  • java常用内存设置

    2021-03-01 08:40:14
    Java虚拟机具有一个堆,是运行时的数据区域,所有类实例和数组内存均从此处分配。堆是在java虚拟机启动时创建的。堆是留给开发人员用的内存区域。非堆就是JVM留给自己用的(方法区,JVM内部处理或优化所需的内存,...
  • java内存溢出的原因和解决方法

    千次阅读 2021-03-16 14:07:17
    java内存溢出的原因和解决方法发布时间:2020-06-15 17:57:39来源:亿速云阅读:85作者:元一内存溢出含义:内存溢出(out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远...
  • JAVA 堆栈内存分析

    2018-06-22 23:31:23
    应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个 值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成, 经验值在3000~5000 左右。 -Xmn2g :设置堆内存年轻代...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 228,106
精华内容 91,242
关键字:

怎么调整java的内存