j***a语言设计内存,j***a的内存

kodinid 13 0

大家好,今天小编关注到一个比较意思的话题,就是关于java语言设计内存问题,于是小编就整理了5个相关介绍Java语言设计内存的解答,让我们一起看看吧。

  1. 生产环境jvm内存应该分配多少合适?
  2. 如何设置Java虚拟机JVM启动内存参数?
  3. 我的世界正版怎么调java内存大小?
  4. JAVA的内存是如何划分的?
  5. 2019款macbookpro内存16G,作为一个java程序员有没有必要上32G?

生产环境jvm内存应该分配多少合适?

对于JAVA8而言,堆内存的初识容量为机器实际内存大小的1/64, 最大内存不超过机器实际内存的1/4.

我们的生产环境一般最大4G内存是上限了,这个视具体业务而定,流量大的互联网公司单机内存占用超过16G就会考虑分布式环境了。

java语言设计内存,java的内存-第1张图片-安济编程网
图片来源网络,侵删)

如何设置J***a虚拟机JVM启动内存参数

设置J***a虚拟机JVM启动内存参数方法如下:Tomcat修改TOMCAT_HOME/bin/catalina.bat,在[echo Using CATALINA_BASE: "%CATALINA_BASE%"] 上面加入,比如:set J***A_OPTS= -server -Xms1536m -Xmx1536m或者J***A_OPTS="-server -Xms1536m -Xmx1536m",服务器模式参数-server不加也可以 ,就变成set J***A_OPTS= -Xms1536m -Xmx1536m或者J***A_OPTS=" -Xms1536m -Xmx1536m",

我的世界正版怎么调j***a内存大小?

打开启动器,点左下角的Edit Profile,然后打开的窗口里,勾选左下角的JVM arguments,右边框框里"-Xmx 1G"这个东西里面的1G就是你设置内存的地方。你可以改成2G或者3G,根据你自己电脑内存而定。

J***A的内存是如何划分的?

J***a虚拟机在执行J***a程序过程中会把它所管理的内存划分为若干不同数据区域,这些区域都有各自的用途以及创建和销毁的时间。J***a虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图(图片来源网上)所示:

java语言设计内存,java的内存-第2张图片-安济编程网
(图片来源网络,侵删)


下面我们具体就每个进行阐述。

运行时数据区域

  1. 方法区:方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息常量静态变量、即时编译器编译后的代码等数据 。方法区包含运行时常量池,是用于存放编译期生成的各种字面量和符号引用的。垃圾收集行为在这个区域比较少出现,但并非数据进了方法区就永久的存在了,这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,当方法区无法满足内存分配需要时,将抛出OutOfMemoryError异常
  2. 虚拟机栈:J***a虚拟机栈是线程私有的 ,它的生命周期与线程相同。虚拟机栈描述的是J***a方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链表、方法出口信息等。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程,如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。这块内存是线程私有的。
  3. 本地方法栈:本地方法栈与虚拟机栈的作用相似,不同之处在于虚拟机栈为虚拟机执行的J***a方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。会抛出stackOverflowError和OutOfMemoryError异常。这块内存是线程私有的。
  4. 堆:堆是所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及其属性都在这里分配内存。堆是垃圾收集器管理的主要区域。由于现在收集器基本***用分代回收算法,所以堆还可细分为:新生代和老年代。如果堆中没有内存完成实例分配,并且堆也无法完成扩展时,将会抛出OutOfMemoryError异常。
  5. 程序计数器:可以看做是当前线程所执行的字节码的行号指示器。这块内存是线程私有的。
  6. 直接内存:直接内存不是虚拟机运行时数据区的一部分,在NIO类中引入一种基于通道与缓冲区的IO方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在J***a堆中的DirectByteBuffer对象作为这块内存的引用进行操作

了解了运行时数据区域相关构成后,下面我们来看看对象的创建过程,如图

java语言设计内存,java的内存-第3张图片-安济编程网
(图片来源网络,侵删)


我们着重看最右边一部分,不同的变量会分配到不同的内存区域里,比如new出来的东西会存放到堆中,而局部变量则是存放在栈中。

总之,了解并掌握这些[_a***_]是一个合格的J***a程序员必需的技能,也只有这样才能写出更好的程序,更好地优化程序的性能

谢邀~

关于JVM的知识,一直令很多J***a程序员头疼,不过JVM也是值得我们深入学习内容,下面我就谈谈自己对JVM内存划分的理解。

学习J***a的朋友应该都知道,J***a程序是在JVM上运行的,所以我们一般谈的J***a内存划分事实上都是指的JVM内存区域的划分。在讨论JVM内存划分之前,我们需要知道J***a程序的执行过程(手动画图,有点儿丑):

通过这个图可以看到,JVM在执行J***a程序的时候,要用到一块空间来存储运行期间用到的数据,这块区域就是我们经常用的运行时区域,也就是常说的JVM内存。

程序计数器(Program Counter Register)、J***a栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。

这个是J***a虚拟机规范规定好的,但是具体怎么实现还是由厂商决定的。

运行的时候,每一个区域存的是什么数据的,先看一张图:

保存指令地址,也就是存的是下一条执行所在的存储地址。如果是多线程的时候,因为一个CPU在一个时刻只能执行一条命令,为了能够让每一个线程在切换之后能够恢复切换之前的位置,每个线程就需要有自己的计数器,所以说:程序计数器是每个线程私有的

2019款macbookpro内存16G,作为一个j***a程序员有没有必要上32G?

太有必要了。

1、MacBook使用年限普遍较长,现在虽然32G用不完,考虑未来留有余地是有必要的;

2、作为j***a后端开发,在目前微服务场景下,16g内存是吃紧的,我们很多员工只能去32g的云服务器调试程序,因为本地开发环境起不了那么多微服务;

3、我目前16g机器日常使用在10-12g左右,包括后台mysql,redis,mq等这些中间件,一个ide环境;有时还会开excel、word,onenote,这些软件实际也很占内存;所以16g使用率在90%左右;已经很高了;

4、如果还同时做ios/Android客户端开发,由于还要起不同版本模拟器测试兼容性,对内存要求更多了。我最多同时起过4个版本的模拟器;当然你也可以开一个用完后关一个;

5、我之前还部署过链全节点,在上面的情况下再部署eth或***c全节点,完全吃不消;要知道eth单独部署全节点都是在独立的16g服务器;

作为j***a后端,涉及的技术栈是很广的,机器配置高有余量非常有必要,正如硬盘现在都要512g起步一样

到此,以上就是小编对于j***a语言设计内存的问题就介绍到这了,希望介绍关于j***a语言设计内存的5点解答对大家有用。

标签: 内存 j***a 虚拟