手机怎么安装qq(支持java的手机怎么安装qq)
手机怎么安装qq,支持java的手机怎么安装qq? 用手机的浏览器打开3g.qq.com然后选择QQ找到下载选择品牌机型如果没有的话可以下载通用版根据屏幕尺寸下载...
2023-04-20
我们首先了解下什么是JVM。
JVM(Java Virtual Machine),简而言之就是java程序的运行环境(java二进制字节码的运行环境)。以下表格比较了JVM、JRE和JDK之间的关系:
| JVM | Java Virtual Machine |
| JRE | JVM+基础类库 |
| JDK | JVM+基础类库+编译工具 |
| 开发javase程序 | JDK+IDE工具 |
| 开发javaee程序 | JDK+IDE工具+应用服务器 |
JVM的内存可以分为5大块:程序计数器、虚拟机栈、本地方法栈、堆以及方法区
1、程序计数器,也称为寄存器。我们知道,java程序的执行顺序是jvm指令->解释器->机器码->CPU,那么程序计数器的作用就是在程序执行的过程中,记住下一条JVM指令的执行地址。当执行完当前JVM指令之后,会在程序计数器中获取到下一条JVM指令的地址,以此去寻找下一条指令。
要记住,程序计数器是每条线程私有的。当线程因为某种原因暂停执行后,该条线程的程序计数器会记录下条指令的地址,等结束暂停后,线程可以从停止的地方继续执行。而且,程序计数器不会存在内存溢出。
2、虚拟机栈,就是每个线程运行需要的内存空间。一个栈由多个栈帧组成,栈帧对应着每个方法运行时需要的内存(参数,局部变量,返回地址等),每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。

当方法结束调用后,对应的栈帧就会被移除出栈。
我们以debug方式运行代码:

查看debug界面可以发现,main、method1和method2方法都以上文的方式被压入栈中:

所以可以知道,垃圾回收不涉及栈内存,因为方法调用完被移除之后,内存就会被释放掉。我们可以通过-Xss设定栈内存的大小,但是请注意,因为我们的物理内存是固定的,所以栈内存并不是越大越好,栈内存设置的越大,我们的线程数量反而越少。
既然可以分配栈的大小,那么什么情况下会出现栈内存溢出呢?第一种是栈帧过多导致栈内存溢出,第二种就是栈帧过大导致栈内存溢出。请看如下代码:
public class Demo1_3 { public static void main(String args[]) { try { m1(); }catch (Exception e) { e.printStackTrace(); } } private static void m1() { m1(); }}由于对m1进行了递归调用,且没有设置退出条件,所以运行后会抛出栈内存溢出错误:
Exception in thread "main" java.lang.StackOverflowError这里还有一个问题,如果多个线程执行m1方法,内部的变量x是线程安全的吗?答案是肯定的,因为每个线程都有自己的栈,栈内的栈帧都会存在自己的变量x,所以方法内的局部变量是线程安全的。
public class Demo1_2 { static void m1() { int x = 0; for (int i=0; i<5000; i++) { x ++; } System.out.println(x); }}但是如果变量x是每个方法公有的,那就需要考虑线程安全的问题了,比如用static修饰:
static int x = 0;3、本地方法栈,就是给本地方法的运行提供运行空间。本地方法,指那些不是由Java代码编写的方法,可以通过本地方法去调用解释器、即时编译器或者垃圾回收器。比如Object类中的clone()方法,真正实现的是c和c++:
protected native Object clone() throws CloneNotSupportedException;4、堆。通过new创建的对象都会使用堆内存,可以通过-Xmx设定堆空间大小。堆有两大特点,一是线程共享,堆中的对象都需要考虑线程安全的问题,二是它有垃圾回收机制。
我们首先看一下堆内存溢出的问题,请看如下代码:
public class Demo1_4{ public static void main(String args[]) { try { List<String> list = new ArrayList<>(); String a = "hello"; while(true) { list.add(a); a = a + a; } }catch (Exception e) { e.printStackTrace(); } }}运行后抛出堆内存溢出错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space5、方法区,是所有JVM共享的区域,存储了跟类的结构相关的信息:运行时常量池,类的成员变量,方法数据,以及成员方法和构造器方法的代码等。方法区是在JVM启动时被创建的,可以通过-XX:MaxMetaspaceSize=10m设置方法区的大小。下图就是JDK1.8中的内存结构:

可以看到,Metaspace作为方法区的实现,包含了Class、ClassLoader和常量池。方法区也会有内存溢出,即元空间的内存溢出:
public class Demo1_5 extends ClassLoader{ public static void main(String args[]) { try { Demo1_5 test = new Demo1_5(); //加载10000个新的类 for (int i=0; i<10000; i++) { //生成类的二进制字节码 ClassWriter cw = new ClassWriter(0); //参数含义:版本号,public,类名,包名,父类,接口 cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Class"+i, null, "java/lang/object", null); //返回类的byte数组 byte[] code = cw.toByteArray(); //执行类的加载 test.defineClass("Class"+i, code, 0, code.length); } }catch (Exception e) { e.printStackTrace(); } }}上述案例演示了加载的类数量过多导致元空间内存溢出,以下是运行后结果:
Error occurred during initialization of VMMaxMetaspaceSize is too small.
以上内容就是为大家推荐的java heap space解决方法(jvm设置堆内存参数)最佳回答,如果还想搜索其他问题,请收藏本网站或点击搜索更多问题
内容来源于网络仅供参考版权声明:所有来源标注为小樱知识网www.xiaoyin02.com的内容版权均为本站所有,若您需要引用、转载,只需要注明来源及原文链接即可。
本文标题:java heap space解决方法(jvm设置堆内存参数)
本文地址:https://www.xiaoyin02.com/shcs/119062.html
相关文章
手机怎么安装qq,支持java的手机怎么安装qq? 用手机的浏览器打开3g.qq.com然后选择QQ找到下载选择品牌机型如果没有的话可以下载通用版根据屏幕尺寸下载...
2023-04-20
pace手环怎么连接手机,corospace2连接不了手机? 连得上,连接方法: 1、首先打开手机设置,点击蓝牙并打开,注意要使外部设备连接到蓝牙就要将开放检...
2023-02-11
手机怎么打开java文件,智能手机怎么打开java文件? 首先要看你这款手机支持不支持java,如果支持,直接打开就行了。不支持的话就没办法了,支持不支持...
2023-02-07
财联社 2 月 5 日讯(编辑 牛占林) 当地时间周六,美国太空探索技术公司 ( SpaceX ) 创始人兼首席执行官埃隆 · 马斯克在推特上透露,该公司可能会在 3 月...
2023-02-06
安卓手机怎么运行java,如何使一个新手机系统兼容安卓应用? 做虚拟机参考阿里云os 这样做的结果就是运行速度大幅下降。因为用虚拟机虚拟java 效率下降...
2023-01-31
热点文章
2021年独生子女补贴新政策是真的吗(独生子女证有有效期吗)
2021年国庆节阅兵仪式几点开始几点结束(2021年国庆节还有阅兵吗)
鼠目寸光一点红是什么生肖动物(鼠目寸光一点红)指什么生肖,紧密
k0到k9的玩法大全(强制gc的玩法和注意事项)
入土为安是什么生肖《入土为安》打一个生肖动物,词语解释
浙江12月底全面停工是真的吗(浙江什么时候放假停工)
如何做t(t怎么把p做哭)
北京口碑最差的三甲医院(北京301医院最擅长什么)