614 THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_PSVirtualSpaceAlignment: Parallel GC is not enabled");
615 WB_END
616
617 WB_ENTRY(jlong, WB_PSHeapGenerationAlignment(JNIEnv* env, jobject o))
618 if (UseParallelGC) {
619 return GenAlignment;
620 }
621 THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_PSHeapGenerationAlignment: Parallel GC is not enabled");
622 WB_END
623
624 #endif // INCLUDE_PARALLELGC
625
626 #if INCLUDE_G1GC
627
628 WB_ENTRY(jobject, WB_G1AuxiliaryMemoryUsage(JNIEnv* env))
629 if (UseG1GC) {
630 ResourceMark rm(THREAD);
631 G1CollectedHeap* g1h = G1CollectedHeap::heap();
632 MemoryUsage usage = g1h->get_auxiliary_data_memory_usage();
633 Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL);
634 return JNIHandles::make_local(env, h());
635 }
636 THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1AuxiliaryMemoryUsage: G1 GC is not enabled");
637 WB_END
638
639 WB_ENTRY(jint, WB_G1ActiveMemoryNodeCount(JNIEnv* env, jobject o))
640 if (UseG1GC) {
641 G1NUMA* numa = G1NUMA::numa();
642 return (jint)numa->num_active_nodes();
643 }
644 THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1ActiveMemoryNodeCount: G1 GC is not enabled");
645 WB_END
646
647 WB_ENTRY(jintArray, WB_G1MemoryNodeIds(JNIEnv* env, jobject o))
648 if (UseG1GC) {
649 G1NUMA* numa = G1NUMA::numa();
650 int num_node_ids = (int)numa->num_active_nodes();
651 const int* node_ids = numa->node_ids();
652
653 typeArrayOop result = oopFactory::new_intArray(num_node_ids, CHECK_NULL);
654 for (int i = 0; i < num_node_ids; i++) {
655 result->int_at_put(i, (jint)node_ids[i]);
656 }
657 return (jintArray) JNIHandles::make_local(env, result);
658 }
659 THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1MemoryNodeIds: G1 GC is not enabled");
660 WB_END
661
662 class OldRegionsLivenessClosure: public HeapRegionClosure {
663
664 private:
665 const int _liveness;
666 size_t _total_count;
667 size_t _total_memory;
668 size_t _total_memory_to_free;
669
670 public:
671 OldRegionsLivenessClosure(int liveness) :
672 _liveness(liveness),
673 _total_count(0),
674 _total_memory(0),
675 _total_memory_to_free(0) { }
676
677 size_t total_count() { return _total_count; }
698 }
699 };
700
701
702 WB_ENTRY(jlongArray, WB_G1GetMixedGCInfo(JNIEnv* env, jobject o, jint liveness))
703 if (!UseG1GC) {
704 THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1GetMixedGCInfo: G1 GC is not enabled");
705 }
706 if (liveness < 0) {
707 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "liveness value should be non-negative");
708 }
709
710 G1CollectedHeap* g1h = G1CollectedHeap::heap();
711 OldRegionsLivenessClosure rli(liveness);
712 g1h->heap_region_iterate(&rli);
713
714 typeArrayOop result = oopFactory::new_longArray(3, CHECK_NULL);
715 result->long_at_put(0, rli.total_count());
716 result->long_at_put(1, rli.total_memory());
717 result->long_at_put(2, rli.total_memory_to_free());
718 return (jlongArray) JNIHandles::make_local(env, result);
719 WB_END
720
721 #endif // INCLUDE_G1GC
722
723 #if INCLUDE_NMT
724 // Alloc memory using the test memory type so that we can use that to see if
725 // NMT picks it up correctly
726 WB_ENTRY(jlong, WB_NMTMalloc(JNIEnv* env, jobject o, jlong size))
727 jlong addr = 0;
728 addr = (jlong)(uintptr_t)os::malloc(size, mtTest);
729 return addr;
730 WB_END
731
732 // Alloc memory with pseudo call stack. The test can create psudo malloc
733 // allocation site to stress the malloc tracking.
734 WB_ENTRY(jlong, WB_NMTMallocWithPseudoStack(JNIEnv* env, jobject o, jlong size, jint pseudo_stack))
735 address pc = (address)(size_t)pseudo_stack;
736 NativeCallStack stack(&pc, 1);
737 return (jlong)(uintptr_t)os::malloc(size, mtTest, stack);
738 WB_END
1661 WB_END
1662
1663 WB_ENTRY(jobjectArray, WB_GetCodeBlob(JNIEnv* env, jobject o, jlong addr))
1664 if (addr == 0) {
1665 THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(),
1666 "WB_GetCodeBlob: addr is null");
1667 }
1668 ThreadToNativeFromVM ttn(thread);
1669 CodeBlobStub stub((CodeBlob*) addr);
1670 return codeBlob2objectArray(thread, env, &stub);
1671 WB_END
1672
1673 WB_ENTRY(jlong, WB_GetMethodData(JNIEnv* env, jobject wv, jobject method))
1674 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
1675 CHECK_JNI_EXCEPTION_(env, 0);
1676 methodHandle mh(thread, Method::checked_resolve_jmethod_id(jmid));
1677 return (jlong) mh->method_data();
1678 WB_END
1679
1680 WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
1681 return (jlong) Thread::current()->stack_size();
1682 WB_END
1683
1684 WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o))
1685 JavaThread* t = JavaThread::current();
1686 return (jlong) t->stack_available(os::current_stack_pointer()) - (jlong)JavaThread::stack_shadow_zone_size();
1687 WB_END
1688
1689
1690 int WhiteBox::array_bytes_to_length(size_t bytes) {
1691 return Array<u1>::bytes_to_length(bytes);
1692 }
1693
1694 WB_ENTRY(jlong, WB_AllocateMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong size))
1695 if (size < 0) {
1696 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
1697 err_msg("WB_AllocateMetaspace: size is negative: " JLONG_FORMAT, size));
1698 }
1699
1700 oop class_loader_oop = JNIHandles::resolve(class_loader);
1701 ClassLoaderData* cld = class_loader_oop != NULL
1702 ? java_lang_ClassLoader::loader_data_acquire(class_loader_oop)
1703 : ClassLoaderData::the_null_class_loader_data();
1704
1705 void* metadata = MetadataFactory::new_array<u1>(cld, WhiteBox::array_bytes_to_length((size_t)size), thread);
1706
1773 Mutex::_safepoint_check_always :
1774 Mutex::_safepoint_check_never;
1775 Mutex::SafepointCheckFlag sfpt_check_attempted = attemptedNoSafepointValue ?
1776 Mutex::_no_safepoint_check_flag :
1777 Mutex::_safepoint_check_flag;
1778 MutexLocker ml(new Mutex(Mutex::leaf, "SFPT_Test_lock", true, sfpt_check_required),
1779 sfpt_check_attempted);
1780 WB_END
1781
1782 WB_ENTRY(void, WB_AssertSpecialLock(JNIEnv* env, jobject o, jboolean allowVMBlock, jboolean safepointCheck))
1783 // Create a special lock violating condition in value
1784 Mutex::SafepointCheckRequired sfpt_check_required = safepointCheck ?
1785 Mutex::_safepoint_check_always :
1786 Mutex::_safepoint_check_never;
1787 Mutex::SafepointCheckFlag safepoint_check = safepointCheck ?
1788 Monitor::_safepoint_check_flag :
1789 Monitor::_no_safepoint_check_flag;
1790
1791 MutexLocker ml(new Mutex(Mutex::special, "SpecialTest_lock", allowVMBlock, sfpt_check_required), safepoint_check);
1792 // If the lock above succeeds, try to safepoint to test the NSV implied with this special lock.
1793 ThreadBlockInVM tbivm(JavaThread::current());
1794 WB_END
1795
1796 WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj))
1797 oop obj_oop = JNIHandles::resolve(obj);
1798 return (jboolean) obj_oop->mark().has_monitor();
1799 WB_END
1800
1801 WB_ENTRY(jboolean, WB_DeflateIdleMonitors(JNIEnv* env, jobject wb))
1802 log_info(monitorinflation)("WhiteBox initiated DeflateIdleMonitors");
1803 return ObjectSynchronizer::request_deflate_idle_monitors();
1804 WB_END
1805
1806 WB_ENTRY(void, WB_ForceSafepoint(JNIEnv* env, jobject wb))
1807 VM_ForceSafepoint force_safepoint_op;
1808 VMThread::execute(&force_safepoint_op);
1809 WB_END
1810
1811 WB_ENTRY(jlong, WB_GetConstantPool(JNIEnv* env, jobject wb, jclass klass))
1812 InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1813 return (jlong) ik->constants();
1940
1941 WB_ENTRY(jboolean, WB_IsShared(JNIEnv* env, jobject wb, jobject obj))
1942 oop obj_oop = JNIHandles::resolve(obj);
1943 return HeapShared::is_archived_object(obj_oop);
1944 WB_END
1945
1946 WB_ENTRY(jboolean, WB_IsSharedClass(JNIEnv* env, jobject wb, jclass clazz))
1947 return (jboolean)MetaspaceShared::is_in_shared_metaspace(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
1948 WB_END
1949
1950 WB_ENTRY(jboolean, WB_AreSharedStringsIgnored(JNIEnv* env))
1951 return !HeapShared::closed_archive_heap_region_mapped();
1952 WB_END
1953
1954 WB_ENTRY(jobject, WB_GetResolvedReferences(JNIEnv* env, jobject wb, jclass clazz))
1955 Klass *k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
1956 if (k->is_instance_klass()) {
1957 InstanceKlass *ik = InstanceKlass::cast(k);
1958 ConstantPool *cp = ik->constants();
1959 objArrayOop refs = cp->resolved_references();
1960 return (jobject)JNIHandles::make_local(env, refs);
1961 } else {
1962 return NULL;
1963 }
1964 WB_END
1965
1966 WB_ENTRY(void, WB_LinkClass(JNIEnv* env, jobject wb, jclass clazz))
1967 Klass *k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
1968 if (!k->is_instance_klass()) {
1969 return;
1970 }
1971 InstanceKlass *ik = InstanceKlass::cast(k);
1972 ik->link_class(THREAD); // may throw verification error
1973 WB_END
1974
1975 WB_ENTRY(jboolean, WB_AreOpenArchiveHeapObjectsMapped(JNIEnv* env))
1976 return HeapShared::open_archive_heap_region_mapped();
1977 WB_END
1978
1979 WB_ENTRY(jboolean, WB_IsCDSIncludedInVmBuild(JNIEnv* env))
1980 #if INCLUDE_CDS
|
614 THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_PSVirtualSpaceAlignment: Parallel GC is not enabled");
615 WB_END
616
617 WB_ENTRY(jlong, WB_PSHeapGenerationAlignment(JNIEnv* env, jobject o))
618 if (UseParallelGC) {
619 return GenAlignment;
620 }
621 THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_PSHeapGenerationAlignment: Parallel GC is not enabled");
622 WB_END
623
624 #endif // INCLUDE_PARALLELGC
625
626 #if INCLUDE_G1GC
627
628 WB_ENTRY(jobject, WB_G1AuxiliaryMemoryUsage(JNIEnv* env))
629 if (UseG1GC) {
630 ResourceMark rm(THREAD);
631 G1CollectedHeap* g1h = G1CollectedHeap::heap();
632 MemoryUsage usage = g1h->get_auxiliary_data_memory_usage();
633 Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL);
634 return JNIHandles::make_local(THREAD, h());
635 }
636 THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1AuxiliaryMemoryUsage: G1 GC is not enabled");
637 WB_END
638
639 WB_ENTRY(jint, WB_G1ActiveMemoryNodeCount(JNIEnv* env, jobject o))
640 if (UseG1GC) {
641 G1NUMA* numa = G1NUMA::numa();
642 return (jint)numa->num_active_nodes();
643 }
644 THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1ActiveMemoryNodeCount: G1 GC is not enabled");
645 WB_END
646
647 WB_ENTRY(jintArray, WB_G1MemoryNodeIds(JNIEnv* env, jobject o))
648 if (UseG1GC) {
649 G1NUMA* numa = G1NUMA::numa();
650 int num_node_ids = (int)numa->num_active_nodes();
651 const int* node_ids = numa->node_ids();
652
653 typeArrayOop result = oopFactory::new_intArray(num_node_ids, CHECK_NULL);
654 for (int i = 0; i < num_node_ids; i++) {
655 result->int_at_put(i, (jint)node_ids[i]);
656 }
657 return (jintArray) JNIHandles::make_local(THREAD, result);
658 }
659 THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1MemoryNodeIds: G1 GC is not enabled");
660 WB_END
661
662 class OldRegionsLivenessClosure: public HeapRegionClosure {
663
664 private:
665 const int _liveness;
666 size_t _total_count;
667 size_t _total_memory;
668 size_t _total_memory_to_free;
669
670 public:
671 OldRegionsLivenessClosure(int liveness) :
672 _liveness(liveness),
673 _total_count(0),
674 _total_memory(0),
675 _total_memory_to_free(0) { }
676
677 size_t total_count() { return _total_count; }
698 }
699 };
700
701
702 WB_ENTRY(jlongArray, WB_G1GetMixedGCInfo(JNIEnv* env, jobject o, jint liveness))
703 if (!UseG1GC) {
704 THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1GetMixedGCInfo: G1 GC is not enabled");
705 }
706 if (liveness < 0) {
707 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "liveness value should be non-negative");
708 }
709
710 G1CollectedHeap* g1h = G1CollectedHeap::heap();
711 OldRegionsLivenessClosure rli(liveness);
712 g1h->heap_region_iterate(&rli);
713
714 typeArrayOop result = oopFactory::new_longArray(3, CHECK_NULL);
715 result->long_at_put(0, rli.total_count());
716 result->long_at_put(1, rli.total_memory());
717 result->long_at_put(2, rli.total_memory_to_free());
718 return (jlongArray) JNIHandles::make_local(THREAD, result);
719 WB_END
720
721 #endif // INCLUDE_G1GC
722
723 #if INCLUDE_NMT
724 // Alloc memory using the test memory type so that we can use that to see if
725 // NMT picks it up correctly
726 WB_ENTRY(jlong, WB_NMTMalloc(JNIEnv* env, jobject o, jlong size))
727 jlong addr = 0;
728 addr = (jlong)(uintptr_t)os::malloc(size, mtTest);
729 return addr;
730 WB_END
731
732 // Alloc memory with pseudo call stack. The test can create psudo malloc
733 // allocation site to stress the malloc tracking.
734 WB_ENTRY(jlong, WB_NMTMallocWithPseudoStack(JNIEnv* env, jobject o, jlong size, jint pseudo_stack))
735 address pc = (address)(size_t)pseudo_stack;
736 NativeCallStack stack(&pc, 1);
737 return (jlong)(uintptr_t)os::malloc(size, mtTest, stack);
738 WB_END
1661 WB_END
1662
1663 WB_ENTRY(jobjectArray, WB_GetCodeBlob(JNIEnv* env, jobject o, jlong addr))
1664 if (addr == 0) {
1665 THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(),
1666 "WB_GetCodeBlob: addr is null");
1667 }
1668 ThreadToNativeFromVM ttn(thread);
1669 CodeBlobStub stub((CodeBlob*) addr);
1670 return codeBlob2objectArray(thread, env, &stub);
1671 WB_END
1672
1673 WB_ENTRY(jlong, WB_GetMethodData(JNIEnv* env, jobject wv, jobject method))
1674 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
1675 CHECK_JNI_EXCEPTION_(env, 0);
1676 methodHandle mh(thread, Method::checked_resolve_jmethod_id(jmid));
1677 return (jlong) mh->method_data();
1678 WB_END
1679
1680 WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
1681 return (jlong) thread->stack_size();
1682 WB_END
1683
1684 WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o))
1685 return (jlong) thread->stack_available(os::current_stack_pointer()) - (jlong)JavaThread::stack_shadow_zone_size();
1686 WB_END
1687
1688
1689 int WhiteBox::array_bytes_to_length(size_t bytes) {
1690 return Array<u1>::bytes_to_length(bytes);
1691 }
1692
1693 WB_ENTRY(jlong, WB_AllocateMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong size))
1694 if (size < 0) {
1695 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
1696 err_msg("WB_AllocateMetaspace: size is negative: " JLONG_FORMAT, size));
1697 }
1698
1699 oop class_loader_oop = JNIHandles::resolve(class_loader);
1700 ClassLoaderData* cld = class_loader_oop != NULL
1701 ? java_lang_ClassLoader::loader_data_acquire(class_loader_oop)
1702 : ClassLoaderData::the_null_class_loader_data();
1703
1704 void* metadata = MetadataFactory::new_array<u1>(cld, WhiteBox::array_bytes_to_length((size_t)size), thread);
1705
1772 Mutex::_safepoint_check_always :
1773 Mutex::_safepoint_check_never;
1774 Mutex::SafepointCheckFlag sfpt_check_attempted = attemptedNoSafepointValue ?
1775 Mutex::_no_safepoint_check_flag :
1776 Mutex::_safepoint_check_flag;
1777 MutexLocker ml(new Mutex(Mutex::leaf, "SFPT_Test_lock", true, sfpt_check_required),
1778 sfpt_check_attempted);
1779 WB_END
1780
1781 WB_ENTRY(void, WB_AssertSpecialLock(JNIEnv* env, jobject o, jboolean allowVMBlock, jboolean safepointCheck))
1782 // Create a special lock violating condition in value
1783 Mutex::SafepointCheckRequired sfpt_check_required = safepointCheck ?
1784 Mutex::_safepoint_check_always :
1785 Mutex::_safepoint_check_never;
1786 Mutex::SafepointCheckFlag safepoint_check = safepointCheck ?
1787 Monitor::_safepoint_check_flag :
1788 Monitor::_no_safepoint_check_flag;
1789
1790 MutexLocker ml(new Mutex(Mutex::special, "SpecialTest_lock", allowVMBlock, sfpt_check_required), safepoint_check);
1791 // If the lock above succeeds, try to safepoint to test the NSV implied with this special lock.
1792 ThreadBlockInVM tbivm(thread);
1793 WB_END
1794
1795 WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj))
1796 oop obj_oop = JNIHandles::resolve(obj);
1797 return (jboolean) obj_oop->mark().has_monitor();
1798 WB_END
1799
1800 WB_ENTRY(jboolean, WB_DeflateIdleMonitors(JNIEnv* env, jobject wb))
1801 log_info(monitorinflation)("WhiteBox initiated DeflateIdleMonitors");
1802 return ObjectSynchronizer::request_deflate_idle_monitors();
1803 WB_END
1804
1805 WB_ENTRY(void, WB_ForceSafepoint(JNIEnv* env, jobject wb))
1806 VM_ForceSafepoint force_safepoint_op;
1807 VMThread::execute(&force_safepoint_op);
1808 WB_END
1809
1810 WB_ENTRY(jlong, WB_GetConstantPool(JNIEnv* env, jobject wb, jclass klass))
1811 InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1812 return (jlong) ik->constants();
1939
1940 WB_ENTRY(jboolean, WB_IsShared(JNIEnv* env, jobject wb, jobject obj))
1941 oop obj_oop = JNIHandles::resolve(obj);
1942 return HeapShared::is_archived_object(obj_oop);
1943 WB_END
1944
1945 WB_ENTRY(jboolean, WB_IsSharedClass(JNIEnv* env, jobject wb, jclass clazz))
1946 return (jboolean)MetaspaceShared::is_in_shared_metaspace(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
1947 WB_END
1948
1949 WB_ENTRY(jboolean, WB_AreSharedStringsIgnored(JNIEnv* env))
1950 return !HeapShared::closed_archive_heap_region_mapped();
1951 WB_END
1952
1953 WB_ENTRY(jobject, WB_GetResolvedReferences(JNIEnv* env, jobject wb, jclass clazz))
1954 Klass *k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
1955 if (k->is_instance_klass()) {
1956 InstanceKlass *ik = InstanceKlass::cast(k);
1957 ConstantPool *cp = ik->constants();
1958 objArrayOop refs = cp->resolved_references();
1959 return (jobject)JNIHandles::make_local(THREAD, refs);
1960 } else {
1961 return NULL;
1962 }
1963 WB_END
1964
1965 WB_ENTRY(void, WB_LinkClass(JNIEnv* env, jobject wb, jclass clazz))
1966 Klass *k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
1967 if (!k->is_instance_klass()) {
1968 return;
1969 }
1970 InstanceKlass *ik = InstanceKlass::cast(k);
1971 ik->link_class(THREAD); // may throw verification error
1972 WB_END
1973
1974 WB_ENTRY(jboolean, WB_AreOpenArchiveHeapObjectsMapped(JNIEnv* env))
1975 return HeapShared::open_archive_heap_region_mapped();
1976 WB_END
1977
1978 WB_ENTRY(jboolean, WB_IsCDSIncludedInVmBuild(JNIEnv* env))
1979 #if INCLUDE_CDS
|