est utilisé par l'interpréteur de bytecode pour sélectionner les instructions de bytecode qui doivent être exécutées. Chaque thread possède un compteur de programme indépendant et les threads ne s'influencent pas mutuellement. Si le thread exécute une méthode Java, ce compteur enregistre l'adresse mémoire de l'instruction de bytecode de la machine virtuelle en cours d'exécution s'il exécute une méthode native ; Le compteur est indéfini. Cette zone est la seule zone de la spécification JVM où le MOO n'existe pas
stocke divers types de données de base connus du compilateur (booléen, octet, char , short, int, float, long, double), application objet (référence). 64 bits doubles et longs occupent 2 emplacements. L'espace mémoire peut être déterminé lors de la compilation. Lors de la saisie d'une méthode, l'espace variable local qui doit être alloué par cette méthode est complètement déterminé via -Xss
Exception :
StackOverflowError La profondeur de la pile est supérieure à la profondeur autorisée par la machine virtuelle MOO Si la pile de la machine virtuelle peut être étendue dynamiquement (la plupart des machines virtuelles Java actuelles peuvent être étendues dynamiquement, mais la spécification de la machine virtuelle Java permet également pile de machines virtuelles de longueur fixe), si l'extension ne peut pas demander suffisamment de mémoireDans un seul thread, si le cadre de pile est trop grand ou si la capacité de la pile de machine virtuelle est trop petite, lorsque la mémoire ne peut pas être allouée , la machine virtuelle lance Ce sont tous des StackOverflowError/** * VM Args:-Xss128k * * stack length:2402 Exception in thread "main" java.lang.StackOverflowError */ public class JavaVMStackSOF { private int stackLength = 1; public void stackLeak() { stackLength++; stackLeak(); } public static void main(String[] args) throws Throwable { JavaVMStackSOF oom = new JavaVMStackSOF(); try { oom.stackLeak(); } catch (Throwable e) { System.out.println("stack length:" + oom.stackLength); throw e; } } }
/** * VM Args:-Xss2M (这时候不妨设大些) * * java.lang.OutOfMemoryError:unable to create new native thread */ public class JavaVMStackOOM { private void dontStop() { while (true) { } } public void stackLeakByThread() { while (true) { Thread thread = new Thread(new Runnable() { @Override public void run() { dontStop(); } }); thread.start(); } } public static void main(String[] args) throws Throwable { JavaVMStackOOM oom = new JavaVMStackOOM(); oom.stackLeakByThread(); } }
/** * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * * java.lang.OutOfMemoryError: Java heap space */ public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject> list = new ArrayList<OOMObject>(); while (true) { list.add(new OOMObject()); } } }
/** * 需要在JDK1.6上才能复现,JDK1.7及之后版本的JVM已经将运行时常量池从方法区中移了出来,在Java 堆(Heap)中开辟了一块区域存放运行时常量池。 * 在JDK1.7上运行的效果则会一直执行,直到堆内存使用完毕 * VM Args:-XX:PermSize=10M -XX:MaxPermSize=10M * * java.lang.OutOfMemoryError:PermGen space */ public class RuntimeConstantPoolOOM { public static void main(String[] args) { // 使用List保持着常量池引用,避免Full GC回收常量池行为 List<String> list = new ArrayList<String>(); // 10MB的PermSize在integer范围内足够产生OOM了 int i = 0; while (true) { list.add(String.valueOf(i++).intern()); } } }
/** * VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M * java.lang.OutOfMemoryError:PermGen space * 一直创建动态类 */ public class JavaMethodAreaOOM { public static void main(String[] args) { while (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(OOMObject.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { return proxy.invokeSuper(obj, args); } }); enhancer.create(); } } static class OOMObject { } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!